sf-builder-agent 0.7.3 → 0.8.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/ai.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ /**
2
+ * AI Vision Module — Uses Claude (via OpenRouter) to analyze Salesforce
3
+ * screenshots and decide 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 OpenRouter API — accepts any OpenRouter key. No Anthropic org
10
+ * restrictions apply since OpenRouter is a separate provider.
11
+ */
12
+ export interface AIDecision {
13
+ action: "click" | "fill" | "navigate" | "scroll" | "keyboard" | "wait" | "done" | "error";
14
+ reasoning: string;
15
+ text?: string;
16
+ selector?: string;
17
+ coordinates?: {
18
+ x: number;
19
+ y: number;
20
+ };
21
+ value?: string;
22
+ url?: string;
23
+ key?: string;
24
+ direction?: "up" | "down";
25
+ amount?: number;
26
+ stepComplete?: boolean;
27
+ stepNotes?: string;
28
+ }
29
+ export interface ActionEntry {
30
+ action: string;
31
+ target: string;
32
+ result: string;
33
+ }
34
+ /** Check if an API key is available (OpenRouter or Anthropic). */
35
+ export declare function hasApiKey(): boolean;
36
+ /**
37
+ * Analyze a screenshot and decide the next action to accomplish the objective.
38
+ *
39
+ * Calls Claude Sonnet via OpenRouter's OpenAI-compatible API.
40
+ */
41
+ 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,120 @@
1
+ /**
2
+ * AI Vision Module — Uses Claude (via OpenRouter) to analyze Salesforce
3
+ * screenshots and decide 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 OpenRouter API — accepts any OpenRouter key. No Anthropic org
10
+ * restrictions apply since OpenRouter is a separate provider.
11
+ */
12
+ // ─── OpenRouter Client ───────────────────────────────────────────────
13
+ const OPENROUTER_URL = "https://openrouter.ai/api/v1/chat/completions";
14
+ const MODEL = "anthropic/claude-sonnet-4-20250514";
15
+ /** Check if an API key is available (OpenRouter or Anthropic). */
16
+ export function hasApiKey() {
17
+ return !!(process.env.OPENROUTER_API_KEY || process.env.ANTHROPIC_API_KEY);
18
+ }
19
+ function getApiKey() {
20
+ const key = process.env.OPENROUTER_API_KEY || process.env.ANTHROPIC_API_KEY;
21
+ if (!key)
22
+ throw new Error("No API key set — provide OPENROUTER_API_KEY");
23
+ return key;
24
+ }
25
+ // ─── System Prompt ───────────────────────────────────────────────────
26
+ 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.
27
+
28
+ ## Actions You Can Take
29
+ - click: Click an element (provide visible text label OR x,y coordinates)
30
+ - fill: Type into a field (click it first, then fill on the next turn)
31
+ - navigate: Go to a URL
32
+ - scroll: Scroll up/down
33
+ - keyboard: Press a key (Enter, Tab, Escape)
34
+ - wait: Wait for page to render (use after actions that change the page)
35
+ - done: Objective is complete
36
+ - error: Cannot proceed (explain why)
37
+
38
+ ## Response Format — JSON only, no markdown
39
+ {
40
+ "action": "click|fill|navigate|scroll|keyboard|wait|done|error",
41
+ "reasoning": "Brief explanation",
42
+ "text": "Visible button/link text to click",
43
+ "coordinates": { "x": 500, "y": 300 },
44
+ "value": "text to type",
45
+ "url": "https://...",
46
+ "key": "Enter",
47
+ "direction": "down",
48
+ "amount": 300,
49
+ "stepComplete": true,
50
+ "stepNotes": "What was accomplished"
51
+ }
52
+
53
+ ## Rules
54
+ 1. ONE action per response
55
+ 2. Prefer clicking by visible TEXT labels (more stable than coordinates)
56
+ 3. Click a field FIRST, then fill it on the NEXT turn
57
+ 4. Use "wait" after clicks that trigger page loads or modals
58
+ 5. Salesforce Lightning is slow — be patient
59
+ 6. If you see a login page, return action: "error" — the user must log in manually
60
+ 7. When the objective is fully met, return action: "done" with stepComplete: true
61
+ 8. Look at the ENTIRE screenshot — SF has nested panels, modals, iframes
62
+ 9. Toast messages (green bar at top) indicate success
63
+ 10. The main Setup content is in the center-right area`;
64
+ // ─── Main Function ───────────────────────────────────────────────────
65
+ /**
66
+ * Analyze a screenshot and decide the next action to accomplish the objective.
67
+ *
68
+ * Calls Claude Sonnet via OpenRouter's OpenAI-compatible API.
69
+ */
70
+ export async function decideNextAction(screenshot, objective, actionHistory, pageUrl, pageTitle, fieldValues, verifyPrompt) {
71
+ const apiKey = getApiKey();
72
+ // Build user message with context
73
+ const historyText = actionHistory.length > 0
74
+ ? `\n\nActions taken so far:\n${actionHistory.map((a, i) => `${i + 1}. ${a.action} → ${a.target} (${a.result})`).join("\n")}`
75
+ : "";
76
+ const fieldsText = fieldValues
77
+ ? `\n\nField values to enter:\n${Object.entries(fieldValues).map(([k, v]) => `- ${k}: "${v}"`).join("\n")}`
78
+ : "";
79
+ const verifyText = verifyPrompt
80
+ ? `\n\nCompletion criteria: ${verifyPrompt}`
81
+ : "";
82
+ const userText = `URL: ${pageUrl}\nTitle: ${pageTitle}\n\nObjective: ${objective}${fieldsText}${verifyText}${historyText}\n\nWhat is the single next action?`;
83
+ const res = await fetch(OPENROUTER_URL, {
84
+ method: "POST",
85
+ headers: {
86
+ "Authorization": `Bearer ${apiKey}`,
87
+ "Content-Type": "application/json",
88
+ "HTTP-Referer": "https://sf-builder.cmgfinancial.ai",
89
+ "X-Title": "SF Builder Agent",
90
+ },
91
+ body: JSON.stringify({
92
+ model: MODEL,
93
+ max_tokens: 1024,
94
+ messages: [
95
+ { role: "system", content: SYSTEM_PROMPT },
96
+ {
97
+ role: "user",
98
+ content: [
99
+ {
100
+ type: "image_url",
101
+ image_url: { url: `data:image/jpeg;base64,${screenshot}` },
102
+ },
103
+ { type: "text", text: userText },
104
+ ],
105
+ },
106
+ ],
107
+ }),
108
+ });
109
+ if (!res.ok) {
110
+ const body = await res.text().catch(() => "");
111
+ throw new Error(`OpenRouter API error (${res.status}): ${body || res.statusText}`);
112
+ }
113
+ const data = await res.json();
114
+ const text = data.choices?.[0]?.message?.content ?? "";
115
+ return JSON.parse(text
116
+ .replace(/```json\n?/g, "")
117
+ .replace(/```/g, "")
118
+ .trim());
119
+ }
120
+ //# 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":"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"}
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>): Promise<CommandResult>;
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
- export async function executeCommand(page, commandType, payload) {
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 OPENROUTER_API_KEY — pass --api-key or set it in your environment / .env file",
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,SAA0D,MAAM,WAAW,CAAC;AAEnF,wEAAwE;AAExE,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;QACrC,QAAQ,EAAE,KAAK;QACf,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;QAC7C,IAAI,EAAE;YACJ,mBAAmB;YACnB,+CAA+C;SAChD;KACF,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,wEAAwE;AAExE;;GAEG;AACH,KAAK,UAAU,WAAW,CACxB,IAAU,EACV,QAAgB,EAChB,UAAqB;IAErB,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,uBAAuB;QACvB,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,QAA8B,CAAC,CAAC;QAE3E,KAAK,MAAM,YAAY,IAAI,UAAU,EAAE,CAAC;YACtC,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAC9B,CAAC,EAAW,EAAE,GAAW,EAAE,EAAE;gBAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACnC,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;gBAC5D,OAAQ,IAAI,CAAC,UAAiC,IAAI,IAAI,CAAC;YACzD,CAAC,EACD,IAAI,EACJ,YAAY,CACb,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CACtC,CAAC,EAAW,EAAE,GAAW,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC,EACD,IAAI,EACJ,QAAQ,CACT,CAAC;QAEF,OAAO,MAAgC,CAAC;IAC1C,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CACxB,IAAU,EACV,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,SAAiB,EAAE,EAAE;QAC7D,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9B,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC1C,CAAC;QACF,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,6CAA6C;QAC7C,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,sDAAsD;QACtD,OAAO,KAAK,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACxD,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,uEAAuE;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,OAAiC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CACvB,IAAU,EACV,QAAgB,EAChB,IAAY;IAEZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CACtC,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;QAC3B,MAAM,UAAU,GAAG,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CACnC,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CACrC,CAAC;QACF,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC,EACD,QAAQ,EACR,IAAI,CACL,CAAC;IAEF,OAAO,MAAgC,CAAC;AAC1C,CAAC;AAED,wEAAwE;AAExE,MAAM,cAAc,GAAG;IACrB,YAAY;IACZ,2BAA2B;IAC3B,sBAAsB;IACtB,sBAAsB;IACtB,4CAA4C;CAC7C,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,cAAsB;IACpE,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAU,EACV,WAAmB,EACnB,OAAgC;IAEhC,IAAI,CAAC;QACH,QAAQ,WAAW,EAAE,CAAC;YACpB,iBAAiB;YACjB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAa,CAAC;gBACxC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,IAAI,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;oBACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC;gBAC/F,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC;YACvD,CAAC;YAED,cAAc;YACd,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAkB,CAAC;gBAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAkC,CAAC;gBAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,IAA0B,CAAC;gBAEhD,IAAI,EAA0B,CAAC;gBAC/B,IAAI,IAAI,EAAE,CAAC;oBACT,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACrD,CAAC;gBACD,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,aAAa;YACb,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAkB,CAAC;gBAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAe,CAAC;gBACtC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAkC,CAAC;gBAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B,CAAC;gBAElD,IAAI,EAAE,GAAkC,IAAI,CAAC;gBAE7C,+BAA+B;gBAC/B,IAAI,KAAK,EAAE,CAAC;oBACV,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACtC,CAAC;gBAED,sCAAsC;gBACtC,IAAI,CAAC,EAAE,EAAE,CAAC;oBACR,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACrD,CAAC;gBAED,6CAA6C;gBAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa;gBAChD,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC5B,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,eAAe;YACf,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAkB,CAAC;gBAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAe,CAAC;gBACtC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAkC,CAAC;gBAE9D,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxC,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;oBACzD,MAAM,IAAI,CAAC,QAAQ,CACjB,CAAC,QAAiB,EAAE,GAAW,EAAE,EAAE;wBAChC,QAA8B,CAAC,KAAK,GAAG,GAAG,CAAC;wBAC5C,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBACjE,CAAC,EACD,EAAE,EACF,KAAK,CACN,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACrC,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,mBAAmB;YACnB,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,QAAQ,GAAI,OAAO,CAAC,QAAoB,IAAI,KAAK,CAAC;gBACxD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;oBAChC,QAAQ;oBACR,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;gBACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAa,EAAE,CAAC;YACtD,CAAC;YAED,iBAAiB;YACjB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAgB,CAAC;gBACxC,mEAAmE;gBACnE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACnC,CAAC;YAED,wBAAwB;YACxB,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAkB,CAAC;gBAC5C,MAAM,OAAO,GAAI,OAAO,CAAC,OAAkB,IAAI,MAAM,CAAC;gBACtD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAkC,CAAC;gBAE9D,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxC,qCAAqC;oBACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;oBACtC,IAAI,KAAK,GAAG,KAAK,CAAC;oBAClB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;wBAC7B,IAAI,CAAC;4BACH,MAAM,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;4BAC9C,KAAK,GAAG,IAAI,CAAC;4BACb,MAAM;wBACR,CAAC;wBAAC,MAAM,CAAC;4BACP,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;wBAC/C,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,MAAM,IAAI,KAAK,CACb,yBAAyB,QAAQ,gBAAgB,CAClD,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBACpD,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,0BAA0B;YAC1B,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,MAAM,OAAO,GAAI,OAAO,CAAC,OAAkB,IAAI,MAAM,CAAC;gBACtD,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,iBAAiB;YACjB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAa,CAAC;gBAClC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAgD,CAAC,CAAC;gBAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,eAAe;YACf,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,QAAQ,GAAI,OAAO,CAAC,QAAmB,IAAI,IAAI,CAAC;gBACtD,MAAM,SAAS,GAAG,OAAO,CAAC,SAA0B,CAAC;gBACrD,MAAM,MAAM,GAAI,OAAO,CAAC,MAAiB,IAAI,GAAG,CAAC;gBAEjD,MAAM,IAAI,CAAC,QAAQ,CACjB,CAAC,GAAkB,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE;oBAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC1D,IAAI,CAAC,MAAM;wBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;oBAEhE,MAAM,KAAK,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;oBAC1C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;wBACtB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oBAC5B,CAAC;yBAAM,CAAC;wBACL,MAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC,EACD,QAAQ,EACR,SAAS,EACT,MAAM,CACP,CAAC;gBACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,cAAc;YACd,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAkB,CAAC;gBAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAkC,CAAC;gBAC9D,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACzD,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,cAAc;YACd,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,EAAE,GAAI,OAAO,CAAC,EAAa,IAAI,KAAK,CAAC;gBAC3C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,aAAa;YACb,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,aAAa;YACb,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YACtD,CAAC;YAED,gBAAgB;YAChB,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,uCAAuC;gBACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBACvC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAClC,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YACvE,CAAC;YAED,iBAAiB;YACjB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC3C,CAAC;YAED;gBACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,WAAW,EAAE,EAAE,CAAC;QAC7E,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC"}
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 ─────────────────────────────────────────────────────
@@ -30,11 +31,16 @@ function parseArgs(argv) {
30
31
  args.url = val;
31
32
  i++;
32
33
  }
34
+ else if (key === "--api-key" && val) {
35
+ args.apiKey = val;
36
+ i++;
37
+ }
33
38
  }
34
39
  return {
35
40
  code: args.code,
36
41
  session: args.session,
37
42
  url: args.url ?? "https://sf-builder.cmgfinancial.ai",
43
+ apiKey: args.apiKey,
38
44
  };
39
45
  }
40
46
  // ─── Prompt Helper ───────────────────────────────────────────────────
@@ -76,12 +82,29 @@ async function main() {
76
82
  const pairResult = await pair(baseUrl, sessionId, code);
77
83
  token = pairResult.token;
78
84
  sessionId = pairResult.sessionId;
85
+ // Server passes OpenRouter API key during pairing — set it automatically
86
+ if (pairResult.apiKey) {
87
+ process.env.OPENROUTER_API_KEY = pairResult.apiKey;
88
+ }
79
89
  console.log("\u2705 Paired successfully");
80
90
  }
81
91
  catch (err) {
82
92
  console.error("\u274C Pairing failed:", err instanceof Error ? err.message : err);
83
93
  process.exit(1);
84
94
  }
95
+ // ── Check for AI capabilities ──
96
+ // Priority: --api-key flag > env var > key from pairing > interactive prompt
97
+ if (args.apiKey) {
98
+ process.env.OPENROUTER_API_KEY = args.apiKey;
99
+ }
100
+ if (hasApiKey()) {
101
+ console.log("\u2728 AI vision enabled");
102
+ }
103
+ else {
104
+ console.log("\u26A0\uFE0F AI vision disabled — no API key received from server");
105
+ }
106
+ // Build context for command executor (used by ai_step for progress reporting)
107
+ const agentContext = { baseUrl, sessionId, token };
85
108
  // ── Step 2: Launch Browser ──
86
109
  console.log("\uD83C\uDF10 Launching browser...");
87
110
  let browser;
@@ -144,7 +167,9 @@ async function main() {
144
167
  ? ` \u2192 ${command.payload.url}`
145
168
  : "";
146
169
  console.log(`\u26A1 Executing: ${label}${payloadHint}`);
147
- const result = await executeCommand(page, command.commandType, command.payload);
170
+ // Pass command ID into payload so ai_step can report progress per-action
171
+ const payloadWithId = { ...command.payload, commandId: command.id };
172
+ const result = await executeCommand(page, command.commandType, payloadWithId, agentContext);
148
173
  // ── Handle login detection ──
149
174
  if (result.waitingForLogin) {
150
175
  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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/pairing.d.ts CHANGED
@@ -5,4 +5,5 @@
5
5
  export declare function pair(baseUrl: string, sessionId: string, code: string): Promise<{
6
6
  token: string;
7
7
  sessionId: string;
8
+ apiKey?: string;
8
9
  }>;
package/dist/pairing.js CHANGED
@@ -17,6 +17,10 @@ export async function pair(baseUrl, sessionId, code) {
17
17
  if (!data.token) {
18
18
  throw new Error("Pairing response did not include a token");
19
19
  }
20
- return { token: data.token, sessionId: data.sessionId ?? sessionId };
20
+ return {
21
+ token: data.token,
22
+ sessionId: data.sessionId ?? sessionId,
23
+ apiKey: data.apiKey || undefined,
24
+ };
21
25
  }
22
26
  //# sourceMappingURL=pairing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAe,EACf,SAAiB,EACjB,IAAY;IAEZ,MAAM,GAAG,GAAG,GAAG,OAAO,iBAAiB,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KAC1C,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,mBAAmB,GAAG,CAAC,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2C,CAAC;IAE1E,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAe,EACf,SAAiB,EACjB,IAAY;IAEZ,MAAM,GAAG,GAAG,GAAG,OAAO,iBAAiB,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KAC1C,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,mBAAmB,GAAG,CAAC,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4D,CAAC;IAE3F,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS;QACtC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;KACjC,CAAC;AACJ,CAAC"}
@@ -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>;
@@ -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,MAAiD,EACjD,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"}
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.7.3",
3
+ "version": "0.8.1",
4
4
  "description": "Desktop agent for SalesForce Agent Creator — executes browser automation commands",
5
5
  "type": "module",
6
6
  "bin": {
package/src/ai.ts ADDED
@@ -0,0 +1,171 @@
1
+ /**
2
+ * AI Vision Module — Uses Claude (via OpenRouter) to analyze Salesforce
3
+ * screenshots and decide 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 OpenRouter API — accepts any OpenRouter key. No Anthropic org
10
+ * restrictions apply since OpenRouter is a separate provider.
11
+ */
12
+
13
+ // ─── Types ───────────────────────────────────────────────────────────
14
+
15
+ export interface AIDecision {
16
+ action: "click" | "fill" | "navigate" | "scroll" | "keyboard" | "wait" | "done" | "error";
17
+ reasoning: string;
18
+ text?: string; // Visible button/link text to click
19
+ selector?: string; // Optional CSS selector hint
20
+ coordinates?: { x: number; y: number };
21
+ value?: string; // Text to type (fill action)
22
+ url?: string; // URL to navigate to
23
+ key?: string; // Key to press (keyboard action)
24
+ direction?: "up" | "down";
25
+ amount?: number; // Scroll amount or wait duration
26
+ stepComplete?: boolean;
27
+ stepNotes?: string; // What was accomplished
28
+ }
29
+
30
+ export interface ActionEntry {
31
+ action: string;
32
+ target: string;
33
+ result: string;
34
+ }
35
+
36
+ // ─── OpenRouter Client ───────────────────────────────────────────────
37
+
38
+ const OPENROUTER_URL = "https://openrouter.ai/api/v1/chat/completions";
39
+ const MODEL = "anthropic/claude-sonnet-4-20250514";
40
+
41
+ /** Check if an API key is available (OpenRouter or Anthropic). */
42
+ export function hasApiKey(): boolean {
43
+ return !!(process.env.OPENROUTER_API_KEY || process.env.ANTHROPIC_API_KEY);
44
+ }
45
+
46
+ function getApiKey(): string {
47
+ const key = process.env.OPENROUTER_API_KEY || process.env.ANTHROPIC_API_KEY;
48
+ if (!key) throw new Error("No API key set — provide OPENROUTER_API_KEY");
49
+ return key;
50
+ }
51
+
52
+ // ─── System Prompt ───────────────────────────────────────────────────
53
+
54
+ 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.
55
+
56
+ ## Actions You Can Take
57
+ - click: Click an element (provide visible text label OR x,y coordinates)
58
+ - fill: Type into a field (click it first, then fill on the next turn)
59
+ - navigate: Go to a URL
60
+ - scroll: Scroll up/down
61
+ - keyboard: Press a key (Enter, Tab, Escape)
62
+ - wait: Wait for page to render (use after actions that change the page)
63
+ - done: Objective is complete
64
+ - error: Cannot proceed (explain why)
65
+
66
+ ## Response Format — JSON only, no markdown
67
+ {
68
+ "action": "click|fill|navigate|scroll|keyboard|wait|done|error",
69
+ "reasoning": "Brief explanation",
70
+ "text": "Visible button/link text to click",
71
+ "coordinates": { "x": 500, "y": 300 },
72
+ "value": "text to type",
73
+ "url": "https://...",
74
+ "key": "Enter",
75
+ "direction": "down",
76
+ "amount": 300,
77
+ "stepComplete": true,
78
+ "stepNotes": "What was accomplished"
79
+ }
80
+
81
+ ## Rules
82
+ 1. ONE action per response
83
+ 2. Prefer clicking by visible TEXT labels (more stable than coordinates)
84
+ 3. Click a field FIRST, then fill it on the NEXT turn
85
+ 4. Use "wait" after clicks that trigger page loads or modals
86
+ 5. Salesforce Lightning is slow — be patient
87
+ 6. If you see a login page, return action: "error" — the user must log in manually
88
+ 7. When the objective is fully met, return action: "done" with stepComplete: true
89
+ 8. Look at the ENTIRE screenshot — SF has nested panels, modals, iframes
90
+ 9. Toast messages (green bar at top) indicate success
91
+ 10. The main Setup content is in the center-right area`;
92
+
93
+ // ─── Main Function ───────────────────────────────────────────────────
94
+
95
+ /**
96
+ * Analyze a screenshot and decide the next action to accomplish the objective.
97
+ *
98
+ * Calls Claude Sonnet via OpenRouter's OpenAI-compatible API.
99
+ */
100
+ export async function decideNextAction(
101
+ screenshot: string,
102
+ objective: string,
103
+ actionHistory: ActionEntry[],
104
+ pageUrl: string,
105
+ pageTitle: string,
106
+ fieldValues?: Record<string, string>,
107
+ verifyPrompt?: string,
108
+ ): Promise<AIDecision> {
109
+ const apiKey = getApiKey();
110
+
111
+ // Build user message with context
112
+ const historyText =
113
+ actionHistory.length > 0
114
+ ? `\n\nActions taken so far:\n${actionHistory.map((a, i) => `${i + 1}. ${a.action} → ${a.target} (${a.result})`).join("\n")}`
115
+ : "";
116
+
117
+ const fieldsText = fieldValues
118
+ ? `\n\nField values to enter:\n${Object.entries(fieldValues).map(([k, v]) => `- ${k}: "${v}"`).join("\n")}`
119
+ : "";
120
+
121
+ const verifyText = verifyPrompt
122
+ ? `\n\nCompletion criteria: ${verifyPrompt}`
123
+ : "";
124
+
125
+ const userText = `URL: ${pageUrl}\nTitle: ${pageTitle}\n\nObjective: ${objective}${fieldsText}${verifyText}${historyText}\n\nWhat is the single next action?`;
126
+
127
+ const res = await fetch(OPENROUTER_URL, {
128
+ method: "POST",
129
+ headers: {
130
+ "Authorization": `Bearer ${apiKey}`,
131
+ "Content-Type": "application/json",
132
+ "HTTP-Referer": "https://sf-builder.cmgfinancial.ai",
133
+ "X-Title": "SF Builder Agent",
134
+ },
135
+ body: JSON.stringify({
136
+ model: MODEL,
137
+ max_tokens: 1024,
138
+ messages: [
139
+ { role: "system", content: SYSTEM_PROMPT },
140
+ {
141
+ role: "user",
142
+ content: [
143
+ {
144
+ type: "image_url",
145
+ image_url: { url: `data:image/jpeg;base64,${screenshot}` },
146
+ },
147
+ { type: "text", text: userText },
148
+ ],
149
+ },
150
+ ],
151
+ }),
152
+ });
153
+
154
+ if (!res.ok) {
155
+ const body = await res.text().catch(() => "");
156
+ throw new Error(`OpenRouter API error (${res.status}): ${body || res.statusText}`);
157
+ }
158
+
159
+ const data = await res.json() as {
160
+ choices: { message: { content: string } }[];
161
+ };
162
+
163
+ const text = data.choices?.[0]?.message?.content ?? "";
164
+
165
+ return JSON.parse(
166
+ text
167
+ .replace(/```json\n?/g, "")
168
+ .replace(/```/g, "")
169
+ .trim(),
170
+ );
171
+ }
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 OPENROUTER_API_KEY — pass --api-key or set it in your environment / .env file",
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";
@@ -22,6 +23,7 @@ function parseArgs(argv: string[]): {
22
23
  code?: string;
23
24
  session?: string;
24
25
  url: string;
26
+ apiKey?: string;
25
27
  } {
26
28
  const args: Record<string, string> = {};
27
29
  for (let i = 2; i < argv.length; i++) {
@@ -36,12 +38,16 @@ function parseArgs(argv: string[]): {
36
38
  } else if (key === "--url" && val) {
37
39
  args.url = val;
38
40
  i++;
41
+ } else if (key === "--api-key" && val) {
42
+ args.apiKey = val;
43
+ i++;
39
44
  }
40
45
  }
41
46
  return {
42
47
  code: args.code,
43
48
  session: args.session,
44
49
  url: args.url ?? "https://sf-builder.cmgfinancial.ai",
50
+ apiKey: args.apiKey,
45
51
  };
46
52
  }
47
53
 
@@ -89,6 +95,10 @@ async function main() {
89
95
  const pairResult = await pair(baseUrl, sessionId, code);
90
96
  token = pairResult.token;
91
97
  sessionId = pairResult.sessionId;
98
+ // Server passes OpenRouter API key during pairing — set it automatically
99
+ if (pairResult.apiKey) {
100
+ process.env.OPENROUTER_API_KEY = pairResult.apiKey;
101
+ }
92
102
  console.log("\u2705 Paired successfully");
93
103
  } catch (err) {
94
104
  console.error(
@@ -98,6 +108,20 @@ async function main() {
98
108
  process.exit(1);
99
109
  }
100
110
 
111
+ // ── Check for AI capabilities ──
112
+ // Priority: --api-key flag > env var > key from pairing > interactive prompt
113
+ if (args.apiKey) {
114
+ process.env.OPENROUTER_API_KEY = args.apiKey;
115
+ }
116
+ if (hasApiKey()) {
117
+ console.log("\u2728 AI vision enabled");
118
+ } else {
119
+ console.log("\u26A0\uFE0F AI vision disabled — no API key received from server");
120
+ }
121
+
122
+ // Build context for command executor (used by ai_step for progress reporting)
123
+ const agentContext: AgentContext = { baseUrl, sessionId, token };
124
+
101
125
  // ── Step 2: Launch Browser ──
102
126
  console.log("\uD83C\uDF10 Launching browser...");
103
127
  let browser: Browser;
@@ -174,7 +198,9 @@ async function main() {
174
198
 
175
199
  console.log(`\u26A1 Executing: ${label}${payloadHint}`);
176
200
 
177
- const result = await executeCommand(page, command.commandType, command.payload);
201
+ // Pass command ID into payload so ai_step can report progress per-action
202
+ const payloadWithId = { ...command.payload, commandId: command.id };
203
+ const result = await executeCommand(page, command.commandType, payloadWithId, agentContext);
178
204
 
179
205
  // ── Handle login detection ──
180
206
  if (result.waitingForLogin) {
package/src/pairing.ts CHANGED
@@ -7,7 +7,7 @@ export async function pair(
7
7
  baseUrl: string,
8
8
  sessionId: string,
9
9
  code: string
10
- ): Promise<{ token: string; sessionId: string }> {
10
+ ): Promise<{ token: string; sessionId: string; apiKey?: string }> {
11
11
  const url = `${baseUrl}/api/agent/pair`;
12
12
 
13
13
  const res = await fetch(url, {
@@ -23,11 +23,15 @@ export async function pair(
23
23
  );
24
24
  }
25
25
 
26
- const data = (await res.json()) as { token?: string; sessionId?: string };
26
+ const data = (await res.json()) as { token?: string; sessionId?: string; apiKey?: string };
27
27
 
28
28
  if (!data.token) {
29
29
  throw new Error("Pairing response did not include a token");
30
30
  }
31
31
 
32
- return { token: data.token, sessionId: data.sessionId ?? sessionId };
32
+ return {
33
+ token: data.token,
34
+ sessionId: data.sessionId ?? sessionId,
35
+ apiKey: data.apiKey || undefined,
36
+ };
33
37
  }
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`;