windows-use 0.2.0 → 0.2.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/cli.js +30 -3
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1617,7 +1617,7 @@ init_types();
|
|
|
1617
1617
|
import { program } from "commander";
|
|
1618
1618
|
import { createInterface } from "readline";
|
|
1619
1619
|
import { createServer } from "http";
|
|
1620
|
-
import { mkdirSync as mkdirSync2, writeFileSync } from "fs";
|
|
1620
|
+
import { existsSync as existsSync4, mkdirSync as mkdirSync2, readFileSync as readFileSync3, writeFileSync } from "fs";
|
|
1621
1621
|
import { join as join3 } from "path";
|
|
1622
1622
|
import { tmpdir } from "os";
|
|
1623
1623
|
function startScreenshotServer(screenshotDir) {
|
|
@@ -1654,7 +1654,35 @@ function startScreenshotServer(screenshotDir) {
|
|
|
1654
1654
|
});
|
|
1655
1655
|
}
|
|
1656
1656
|
program.name("windows-use").description("Run Windows/browser automation tasks using a small LLM agent").version("0.2.0");
|
|
1657
|
-
program.command("init").description("Interactive setup
|
|
1657
|
+
program.command("init").description("Interactive setup, or import/export config via base64").argument("[base64]", "Import config from a base64 string").option("--export", "Export current config as a base64 string").action(async (base64Input, opts) => {
|
|
1658
|
+
const configPath = getConfigPath();
|
|
1659
|
+
if (opts.export) {
|
|
1660
|
+
if (!existsSync4(configPath)) {
|
|
1661
|
+
console.error("No config found. Run `windows-use init` first.");
|
|
1662
|
+
process.exit(1);
|
|
1663
|
+
}
|
|
1664
|
+
const raw = readFileSync3(configPath, "utf-8");
|
|
1665
|
+
const encoded = Buffer.from(raw).toString("base64");
|
|
1666
|
+
console.log(encoded);
|
|
1667
|
+
return;
|
|
1668
|
+
}
|
|
1669
|
+
if (base64Input) {
|
|
1670
|
+
try {
|
|
1671
|
+
const decoded = Buffer.from(base64Input, "base64").toString("utf-8");
|
|
1672
|
+
const parsed = JSON.parse(decoded);
|
|
1673
|
+
writeFileSync(configPath, JSON.stringify(parsed, null, 2) + "\n", "utf-8");
|
|
1674
|
+
console.log(`\u2705 Config imported to ${configPath}`);
|
|
1675
|
+
const display = { ...parsed };
|
|
1676
|
+
if (display.apiKey) {
|
|
1677
|
+
display.apiKey = display.apiKey.slice(0, 6) + "..." + display.apiKey.slice(-4);
|
|
1678
|
+
}
|
|
1679
|
+
console.log(JSON.stringify(display, null, 2));
|
|
1680
|
+
} catch {
|
|
1681
|
+
console.error("Invalid base64 or JSON. Make sure you copied the full string.");
|
|
1682
|
+
process.exit(1);
|
|
1683
|
+
}
|
|
1684
|
+
return;
|
|
1685
|
+
}
|
|
1658
1686
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
1659
1687
|
const ask = (q) => new Promise((resolve) => rl.question(q, (a) => resolve(a.trim())));
|
|
1660
1688
|
console.log("\n\u{1F527} windows-use setup\n");
|
|
@@ -1666,7 +1694,6 @@ program.command("init").description("Interactive setup \u2014 save config to ~/.
|
|
|
1666
1694
|
if (baseURL) config.baseURL = baseURL;
|
|
1667
1695
|
if (apiKey) config.apiKey = apiKey;
|
|
1668
1696
|
if (model) config.model = model;
|
|
1669
|
-
const configPath = getConfigPath();
|
|
1670
1697
|
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
1671
1698
|
console.log(`
|
|
1672
1699
|
\u2705 Config saved to ${configPath}`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/schema.ts","../src/config/loader.ts","../src/agent/context-manager.ts","../src/agent/llm-client.ts","../src/agent/system-prompt.ts","../src/agent/runner.ts","../src/tools/browser/client.ts","../src/tools/zod-to-json.ts","../src/tools/registry.ts","../src/tools/windows/grid-overlay.ts","../src/tools/windows/screenshot.ts","../src/tools/windows/mouse.ts","../src/tools/windows/keyboard.ts","../src/tools/windows/command.ts","../src/tools/file/read.ts","../src/tools/file/write.ts","../src/tools/file/image.ts","../src/tools/browser/navigate.ts","../src/tools/browser/click.ts","../src/tools/browser/type.ts","../src/tools/browser/screenshot.ts","../src/tools/browser/content.ts","../src/tools/browser/scroll.ts","../src/tools/control/report.ts","../src/tools/index.ts","../src/tools/types.ts","../src/mcp/session-registry.ts","../src/mcp/tools.ts","../src/mcp/server.ts","../src/cli.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const ConfigSchema = z.object({\n apiKey: z.string().min(1, 'API key is required'),\n baseURL: z.string().url('Must be a valid URL'),\n model: z.string().min(1, 'Model name is required'),\n maxSteps: z.number().int().positive().default(50),\n maxRounds: z.number().int().positive().default(20),\n cdpUrl: z.string().default('http://localhost:9222'),\n timeoutMs: z.number().default(300_000),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n","import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { ConfigSchema, type Config } from './schema.js';\n\nconst CONFIG_FILE = join(homedir(), '.windows-use.json');\n\nexport interface FileConfig {\n apiKey?: string;\n baseURL?: string;\n model?: string;\n maxSteps?: number;\n maxRounds?: number;\n cdpUrl?: string;\n timeoutMs?: number;\n}\n\n/** Load saved config from ~/.windows-use.json */\nexport function loadFileConfig(): FileConfig {\n if (!existsSync(CONFIG_FILE)) return {};\n try {\n return JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n\n/**\n * Load config with priority: overrides > env vars > config file > defaults\n */\nexport function loadConfig(overrides?: Partial<Config>): Config {\n const file = loadFileConfig();\n\n const raw = {\n apiKey: overrides?.apiKey ?? process.env.WINDOWS_USE_API_KEY ?? file.apiKey ?? '',\n baseURL: overrides?.baseURL ?? process.env.WINDOWS_USE_BASE_URL ?? file.baseURL ?? '',\n model: overrides?.model ?? process.env.WINDOWS_USE_MODEL ?? file.model ?? '',\n maxSteps: overrides?.maxSteps ?? intEnv('WINDOWS_USE_MAX_STEPS') ?? file.maxSteps ?? 50,\n maxRounds: overrides?.maxRounds ?? intEnv('WINDOWS_USE_MAX_ROUNDS') ?? file.maxRounds ?? 20,\n cdpUrl: overrides?.cdpUrl ?? process.env.WINDOWS_USE_CDP_URL ?? file.cdpUrl ?? 'http://localhost:9222',\n timeoutMs: overrides?.timeoutMs ?? intEnv('WINDOWS_USE_TIMEOUT_MS') ?? file.timeoutMs ?? 300_000,\n };\n\n return ConfigSchema.parse(raw);\n}\n\nfunction intEnv(name: string): number | undefined {\n const val = process.env[name];\n if (val === undefined) return undefined;\n const n = parseInt(val, 10);\n return isNaN(n) ? undefined : n;\n}\n","import type OpenAI from 'openai';\n\ntype Message = OpenAI.Chat.Completions.ChatCompletionMessageParam;\n\n/**\n * Simple message history — stores all messages without windowing.\n * Small models are cheap, no need to truncate context.\n */\nexport class ContextManager {\n private messages: Message[] = [];\n\n append(message: Message): void {\n this.messages.push(message);\n }\n\n /** Returns all messages. */\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n /** Total messages stored. */\n get length(): number {\n return this.messages.length;\n }\n}\n","import OpenAI from 'openai';\nimport type { Config } from '../config/schema.js';\n\nexport class LLMClient {\n private client: OpenAI;\n private model: string;\n\n constructor(config: Config) {\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseURL,\n });\n this.model = config.model;\n }\n\n async chat(\n messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n tools: OpenAI.Chat.Completions.ChatCompletionTool[],\n ): Promise<OpenAI.Chat.Completions.ChatCompletion> {\n return this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: tools.length > 0 ? tools : undefined,\n tool_choice: tools.length > 0 ? 'auto' : undefined,\n });\n }\n}\n","export function buildSystemPrompt(): string {\n return `You are a precise Windows and browser automation agent. Your job is to execute instructions by calling the tools available to you.\n\n## Workflow\n1. Take a screenshot first to understand the current state of the screen.\n2. Plan the minimal sequence of actions needed.\n3. Execute each action one at a time, then verify by taking another screenshot.\n4. When the task is done, you are blocked, or you need guidance, call \\`report\\` immediately.\n\n## Rules\n- ALWAYS take a screenshot before your first action to understand the current state.\n- After every mouse click or keyboard action, take a screenshot to verify the result.\n- Call ONE tool at a time. Never request multiple tools in parallel.\n- Before each tool call, briefly state what you are about to do and why.\n- After receiving a tool result, describe what you observed.\n- For browser tasks, prefer using browser_* tools over clicking on-screen coordinates.\n- For terminal tasks, prefer \\`run_command\\` over GUI interactions when possible.\n- Do not read or write files unless the instruction explicitly asks for it.\n\n## report Tool\nCall \\`report\\` when:\n- **\"completed\"**: The task is done successfully. Summarize what was accomplished.\n- **\"blocked\"**: You cannot proceed (CAPTCHA, login wall, unexpected error). Explain what's blocking you.\n- **\"need_guidance\"**: You need a decision or clarification. Describe what you need.\n\nCalling \\`report\\` stops your execution. The \\`content\\` field supports a rich document format — mix text with screenshots using \\`[Image:img_X]\\` markers:\n\n\\`\\`\\`\nreport({\n status: \"completed\",\n content: \"Here is what I found:\\\\n[Image:img_2]\\\\nThe page shows the search results.\\\\n[Image:img_3]\\\\nI also checked the sidebar.\"\n})\n\\`\\`\\`\n\nEach screenshot tool returns a screenshot ID (e.g. img_1, img_2). Use these IDs to embed images in your report.\n\n## Important\n- Do NOT keep retrying the same failing action. If something fails twice, call \\`report\\` with status \"blocked\".\n- If a UI element is not where you expect it, try scrolling first before giving up.\n- Keep your responses concise. Focus on actions, not explanations.`;\n}\n","import type OpenAI from 'openai';\nimport type { Config } from '../config/schema.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { ToolContext, ToolResult } from '../tools/types.js';\nimport { ContextManager } from './context-manager.js';\nimport { LLMClient } from './llm-client.js';\nimport { buildSystemPrompt } from './system-prompt.js';\n\nexport interface RunResult {\n status: 'completed' | 'blocked' | 'need_guidance';\n /** Rich content with [Image:img_X] markers. Use parseReportContent() to expand. */\n content: string;\n data?: unknown;\n stepsUsed: number;\n}\n\nexport type StepEvent =\n | { type: 'thinking'; step: number; content: string }\n | { type: 'tool_call'; step: number; name: string; args: unknown }\n | { type: 'tool_result'; step: number; name: string; result: string }\n | { type: 'error'; step: number; message: string };\n\nexport type OnStepCallback = (event: StepEvent) => void;\n\nexport class AgentRunner {\n private llmClient: LLMClient;\n private contextManager: ContextManager;\n private toolRegistry: ToolRegistry;\n private config: Config;\n private toolContext: ToolContext;\n private initialized = false;\n private onStep: OnStepCallback | null = null;\n private roundsUsed = 0;\n\n constructor(\n llmClient: LLMClient,\n contextManager: ContextManager,\n toolRegistry: ToolRegistry,\n config: Config,\n toolContext: ToolContext,\n ) {\n this.llmClient = llmClient;\n this.contextManager = contextManager;\n this.toolRegistry = toolRegistry;\n this.config = config;\n this.toolContext = toolContext;\n }\n\n /** Register a callback to receive step-by-step progress events */\n setOnStep(cb: OnStepCallback): void {\n this.onStep = cb;\n }\n\n private emit(event: StepEvent): void {\n this.onStep?.(event);\n }\n\n /** How many instruction rounds have been used in this session */\n get currentRound(): number {\n return this.roundsUsed;\n }\n\n /** Whether this session has exhausted its max rounds */\n get roundsExhausted(): boolean {\n return this.roundsUsed >= this.config.maxRounds;\n }\n\n async run(instruction: string): Promise<RunResult> {\n // Check round limit\n if (this.roundsExhausted) {\n return {\n status: 'blocked',\n content: `Session has reached the maximum number of instruction rounds (${this.config.maxRounds}). Create a new session to continue.`,\n stepsUsed: 0,\n };\n }\n\n this.roundsUsed++;\n\n // Inject system prompt on first run\n if (!this.initialized) {\n this.contextManager.append({\n role: 'system',\n content: buildSystemPrompt(),\n });\n this.initialized = true;\n }\n\n // Add the instruction as a user message\n this.contextManager.append({\n role: 'user',\n content: instruction,\n });\n\n let stepsUsed = 0;\n\n while (stepsUsed < this.config.maxSteps) {\n stepsUsed++;\n const remaining = this.config.maxSteps - stepsUsed;\n\n const messages = this.contextManager.getMessages();\n\n // Warn the model when steps are running low\n if (remaining <= 3 && remaining >= 0) {\n messages.push({\n role: 'system',\n content: `⚠️ You have ${remaining} steps remaining. Call \\`report\\` NOW to summarize your progress. If you do not call report, your work will be lost.`,\n });\n }\n\n const tools = this.toolRegistry.toOpenAIFormat();\n\n let response: OpenAI.Chat.Completions.ChatCompletion;\n try {\n response = await this.llmClient.chat(messages, tools);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.emit({ type: 'error', step: stepsUsed, message: `LLM API error: ${msg}` });\n return {\n status: 'blocked',\n content: `LLM API error: ${msg}`,\n stepsUsed,\n };\n }\n\n const choice = response.choices[0];\n if (!choice) {\n return {\n status: 'blocked',\n content: 'LLM returned empty response',\n stepsUsed,\n };\n }\n\n const message = choice.message;\n\n // If model has text content (thinking), emit it\n if (message.content) {\n this.emit({ type: 'thinking', step: stepsUsed, content: message.content });\n }\n\n // If model stops without tool calls, treat as implicit report\n if (choice.finish_reason === 'stop' || !message.tool_calls?.length) {\n const text = message.content ?? '';\n this.contextManager.append({ role: 'assistant', content: text });\n return {\n status: 'need_guidance',\n content: text || 'Agent stopped without calling report.',\n stepsUsed,\n };\n }\n\n // Append assistant message with tool_calls to history\n this.contextManager.append(message as any);\n\n // Process tool calls sequentially\n for (const toolCall of message.tool_calls) {\n const toolName = toolCall.function.name;\n let args: unknown;\n try {\n args = JSON.parse(toolCall.function.arguments);\n } catch {\n this.emit({ type: 'error', step: stepsUsed, message: `Failed to parse args for ${toolName}` });\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: 'Error: could not parse tool arguments as JSON',\n });\n continue;\n }\n\n this.emit({ type: 'tool_call', step: stepsUsed, name: toolName, args });\n\n let result: ToolResult;\n try {\n result = await this.toolRegistry.execute(\n toolName,\n args,\n this.toolContext,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.emit({ type: 'error', step: stepsUsed, message: `${toolName} failed: ${msg}` });\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: `Error executing tool: ${msg}`,\n });\n continue;\n }\n\n // Check for report signal — the only clean exit\n if (result.type === 'report') {\n this.emit({ type: 'tool_result', step: stepsUsed, name: toolName, result: `[${result.status}] report submitted` });\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: 'Report submitted. Returning control to caller.',\n });\n return {\n status: result.status,\n content: result.content,\n data: result.data,\n stepsUsed,\n };\n }\n\n // Image results: send as multimodal content with screenshot ID\n if (result.type === 'image') {\n this.emit({ type: 'tool_result', step: stepsUsed, name: toolName, result: `Screenshot captured (${result.screenshotId})` });\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: [\n { type: 'text', text: `Screenshot captured. ID: ${result.screenshotId}` },\n {\n type: 'image_url',\n image_url: {\n url: `data:${result.mimeType};base64,${result.base64}`,\n },\n },\n ],\n } as any);\n } else {\n // Text results — truncate for display\n const preview = result.content.length > 200\n ? result.content.slice(0, 200) + '...'\n : result.content;\n this.emit({ type: 'tool_result', step: stepsUsed, name: toolName, result: preview });\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: result.content,\n });\n }\n }\n }\n\n // Max steps exceeded\n return {\n status: 'blocked',\n content: `Exceeded maximum steps limit (${this.config.maxSteps}). Task may be incomplete.`,\n stepsUsed,\n };\n }\n}\n","import type { Browser, BrowserContext, Page } from 'playwright';\nimport { existsSync, mkdirSync, cpSync, readdirSync } from 'fs';\nimport { spawn, execSync, type ChildProcess } from 'child_process';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\n/** Common Chrome paths on Windows / macOS / Linux */\nconst CHROME_PATHS = [\n // Windows\n 'C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n 'C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n `${process.env.LOCALAPPDATA ?? ''}\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe`,\n // macOS\n '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n // Linux\n '/usr/bin/google-chrome',\n '/usr/bin/google-chrome-stable',\n '/usr/bin/chromium-browser',\n '/usr/bin/chromium',\n];\n\n/** Directories to skip when copying profile (large caches, not needed for login state) */\nconst SKIP_DIRS = new Set([\n 'Cache',\n 'Code Cache',\n 'GPUCache',\n 'Service Worker',\n 'CacheStorage',\n 'File System',\n 'blob_storage',\n 'IndexedDB',\n 'DawnCache',\n 'GrShaderCache',\n 'ShaderCache',\n 'optimization_guide_model_store',\n 'BrowserMetrics',\n 'Crashpad',\n 'component_crx_cache',\n]);\n\nfunction findChrome(): string | null {\n for (const p of CHROME_PATHS) {\n if (p && existsSync(p)) return p;\n }\n return null;\n}\n\n/** Find the user's real Chrome profile directory */\nfunction findUserDataDir(): string | null {\n const candidates = [\n // Windows\n join(process.env.LOCALAPPDATA ?? '', 'Google', 'Chrome', 'User Data'),\n // macOS\n join(homedir(), 'Library', 'Application Support', 'Google', 'Chrome'),\n // Linux\n join(homedir(), '.config', 'google-chrome'),\n join(homedir(), '.config', 'chromium'),\n ];\n for (const p of candidates) {\n if (p && existsSync(p)) return p;\n }\n return null;\n}\n\nfunction getCdpPort(cdpUrl: string): number {\n try {\n return parseInt(new URL(cdpUrl).port, 10) || 9222;\n } catch {\n return 9222;\n }\n}\n\n/** Check if any Chrome process is currently running */\nfunction isChromeRunning(): boolean {\n try {\n if (process.platform === 'win32') {\n const out = execSync('tasklist /FI \"IMAGENAME eq chrome.exe\" /NH', {\n encoding: 'utf-8',\n windowsHide: true,\n });\n return out.includes('chrome.exe');\n } else {\n execSync('pgrep -x \"chrome|chromium|google-chrome\"', { encoding: 'utf-8' });\n return true;\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Copy user's Chrome profile to our working directory, skipping large cache dirs.\n * This preserves cookies, login state, extensions, etc.\n */\nfunction syncProfile(sourceDir: string, targetDir: string): void {\n mkdirSync(targetDir, { recursive: true });\n\n // Copy top-level files (Local State, etc.)\n const entries = readdirSync(sourceDir, { withFileTypes: true });\n for (const entry of entries) {\n const src = join(sourceDir, entry.name);\n const dst = join(targetDir, entry.name);\n\n if (entry.isFile()) {\n try {\n cpSync(src, dst, { force: true });\n } catch {\n // Some files may be locked, skip them\n }\n } else if (entry.isDirectory()) {\n if (entry.name === 'Default' || entry.name.startsWith('Profile ')) {\n // Copy profile dirs, skipping caches\n syncProfileDir(src, dst);\n } else if (!SKIP_DIRS.has(entry.name)) {\n // Copy other small dirs\n try {\n cpSync(src, dst, { recursive: true, force: true });\n } catch {\n // Skip locked/inaccessible dirs\n }\n }\n }\n }\n}\n\nfunction syncProfileDir(sourceDir: string, targetDir: string): void {\n mkdirSync(targetDir, { recursive: true });\n\n let entries;\n try {\n entries = readdirSync(sourceDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (SKIP_DIRS.has(entry.name)) continue;\n\n const src = join(sourceDir, entry.name);\n const dst = join(targetDir, entry.name);\n\n try {\n if (entry.isFile()) {\n cpSync(src, dst, { force: true });\n } else if (entry.isDirectory()) {\n cpSync(src, dst, { recursive: true, force: true });\n }\n } catch {\n // Skip locked files\n }\n }\n}\n\n/**\n * Manages a Playwright CDP connection to the user's Chrome.\n * Auto-launches Chrome with --remote-debugging-port if not already running.\n * Syncs user's Chrome profile to preserve cookies/login state.\n */\nexport class BrowserClient {\n private browser: Browser | null = null;\n private context: BrowserContext | null = null;\n private _page: Page | null = null;\n private cdpUrl: string;\n private chromeProcess: ChildProcess | null = null;\n\n constructor(cdpUrl: string) {\n this.cdpUrl = cdpUrl;\n }\n\n async connect(): Promise<void> {\n if (this.browser) return;\n\n const { chromium } = await import('playwright');\n\n // Try connecting to existing Chrome with CDP\n try {\n this.browser = await chromium.connectOverCDP(this.cdpUrl);\n } catch {\n // CDP not available — need to (re)launch Chrome\n await this.launchChrome();\n this.browser = await chromium.connectOverCDP(this.cdpUrl);\n }\n\n const contexts = this.browser.contexts();\n this.context = contexts[0] ?? await this.browser.newContext();\n\n const pages = this.context.pages();\n this._page = pages[0] ?? await this.context.newPage();\n }\n\n private async launchChrome(): Promise<void> {\n const chromePath = findChrome();\n if (!chromePath) {\n throw new Error(\n 'Chrome not found. Please install Chrome or start it manually with: chrome --remote-debugging-port=9222',\n );\n }\n\n const port = getCdpPort(this.cdpUrl);\n\n // If Chrome is already running without CDP, kill it first\n if (isChromeRunning()) {\n console.error('[windows-use] Chrome is running without CDP. Restarting with --remote-debugging-port...');\n try {\n if (process.platform === 'win32') {\n execSync('taskkill /F /IM chrome.exe /T', { windowsHide: true, stdio: 'ignore' });\n } else {\n execSync('pkill -f chrome', { stdio: 'ignore' });\n }\n } catch {\n // May fail if already exited\n }\n await new Promise((r) => setTimeout(r, 1500));\n }\n\n // --user-data-dir is REQUIRED for --remote-debugging-port to work\n const targetDir = join(homedir(), '.windows-use', 'chrome-profile');\n\n // Sync user's profile to preserve cookies/login state\n const userDir = findUserDataDir();\n if (userDir) {\n console.error('[windows-use] Syncing Chrome profile (cookies, login state)...');\n syncProfile(userDir, targetDir);\n console.error('[windows-use] Profile synced.');\n } else {\n mkdirSync(targetDir, { recursive: true });\n }\n\n console.error(`[windows-use] Launching Chrome with --remote-debugging-port=${port}`);\n\n this.chromeProcess = spawn(\n chromePath,\n [\n `--remote-debugging-port=${port}`,\n `--user-data-dir=${targetDir}`,\n ],\n { detached: true, stdio: 'ignore' },\n );\n this.chromeProcess.unref();\n\n // Wait for CDP to be ready\n for (let i = 0; i < 30; i++) {\n try {\n const res = await fetch(`http://localhost:${port}/json/version`);\n if (res.ok) return;\n } catch {\n // Not ready yet\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n\n throw new Error('Chrome launched but CDP endpoint did not become available within 15s');\n }\n\n async getPage(): Promise<Page> {\n await this.connect();\n return this._page!;\n }\n\n /** Create a new tab and switch to it. */\n async newPage(): Promise<Page> {\n await this.connect();\n this._page = await this.context!.newPage();\n return this._page;\n }\n\n async close(): Promise<void> {\n if (this.browser) {\n await this.browser.close().catch(() => {});\n this.browser = null;\n this.context = null;\n this._page = null;\n }\n }\n\n get connected(): boolean {\n return this.browser !== null && this.browser.isConnected();\n }\n}\n","import type { z } from 'zod';\n\n/**\n * Simple zod-to-JSON-Schema converter for OpenAI tool definitions.\n * Handles the subset of zod types we use (object, string, number, enum, boolean, optional, default, describe).\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n return convertZodType(schema);\n}\n\nfunction convertZodType(schema: z.ZodType): Record<string, unknown> {\n const def = (schema as any)._def;\n const typeName: string = def?.typeName;\n\n switch (typeName) {\n case 'ZodObject': {\n const shape = (schema as z.ZodObject<any>).shape;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = convertZodType(value as z.ZodType);\n if (!isOptional(value as z.ZodType)) {\n required.push(key);\n }\n }\n\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n }\n\n case 'ZodString': {\n const result: Record<string, unknown> = { type: 'string' };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case 'ZodNumber': {\n const result: Record<string, unknown> = { type: 'number' };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case 'ZodBoolean': {\n const result: Record<string, unknown> = { type: 'boolean' };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case 'ZodEnum': {\n const result: Record<string, unknown> = {\n type: 'string',\n enum: def.values,\n };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case 'ZodArray': {\n const result: Record<string, unknown> = {\n type: 'array',\n items: convertZodType(def.type),\n };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case 'ZodOptional':\n return convertZodType(def.innerType);\n\n case 'ZodDefault':\n return convertZodType(def.innerType);\n\n case 'ZodEffects':\n return convertZodType(def.schema);\n\n case 'ZodUnknown':\n return {};\n\n default:\n return { type: 'string' };\n }\n}\n\nfunction isOptional(schema: z.ZodType): boolean {\n const def = (schema as any)._def;\n const typeName: string = def?.typeName;\n return typeName === 'ZodOptional' || typeName === 'ZodDefault';\n}\n","import type { ToolDefinition, ToolContext, ToolResult } from './types.js';\nimport { zodToJsonSchema } from './zod-to-json.js';\nimport type OpenAI from 'openai';\n\nexport class ToolRegistry {\n private tools = new Map<string, ToolDefinition>();\n\n register(tool: ToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n get(name: string): ToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n toOpenAIFormat(): OpenAI.Chat.Completions.ChatCompletionTool[] {\n return Array.from(this.tools.values()).map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: zodToJsonSchema(tool.parameters),\n },\n }));\n }\n\n async execute(\n name: string,\n args: unknown,\n context: ToolContext,\n ): Promise<ToolResult> {\n const tool = this.tools.get(name);\n if (!tool) {\n return { type: 'text', content: `Error: unknown tool \"${name}\"` };\n }\n\n const parsed = tool.parameters.safeParse(args);\n if (!parsed.success) {\n return {\n type: 'text',\n content: `Error: invalid arguments for \"${name}\": ${parsed.error.message}`,\n };\n }\n\n return tool.execute(parsed.data, context);\n }\n}\n","import sharp from 'sharp';\n\nexport interface GridOptions {\n /** Minor grid line spacing in pixels (default: 100) */\n gridSpacing?: number;\n /** Coordinate label spacing in pixels (default: 200) */\n labelSpacing?: number;\n}\n\n/**\n * Add a coordinate grid overlay to a JPEG image buffer.\n * Returns a new JPEG buffer with grid lines and coordinate labels.\n */\nexport async function addCoordinateGrid(\n imageBuffer: Buffer,\n width: number,\n height: number,\n options: GridOptions = {},\n): Promise<Buffer> {\n const gridSpacing = options.gridSpacing ?? 100;\n const labelSpacing = options.labelSpacing ?? 200;\n const majorSpacing = gridSpacing * 5; // 500px\n\n const svgParts: string[] = [];\n\n // --- Grid lines ---\n for (let x = gridSpacing; x < width; x += gridSpacing) {\n const isMajor = x % majorSpacing === 0;\n const opacity = isMajor ? 0.35 : 0.15;\n const sw = isMajor ? 1.5 : 0.5;\n svgParts.push(\n `<line x1=\"${x}\" y1=\"0\" x2=\"${x}\" y2=\"${height}\" stroke=\"rgba(255,50,50,${opacity})\" stroke-width=\"${sw}\"/>`,\n );\n }\n for (let y = gridSpacing; y < height; y += gridSpacing) {\n const isMajor = y % majorSpacing === 0;\n const opacity = isMajor ? 0.35 : 0.15;\n const sw = isMajor ? 1.5 : 0.5;\n svgParts.push(\n `<line x1=\"0\" y1=\"${y}\" x2=\"${width}\" y2=\"${y}\" stroke=\"rgba(255,50,50,${opacity})\" stroke-width=\"${sw}\"/>`,\n );\n }\n\n // --- Coordinate labels along top edge ---\n for (let x = labelSpacing; x < width; x += labelSpacing) {\n const text = String(x);\n const tw = text.length * 7.5 + 6;\n svgParts.push(\n `<rect x=\"${x - tw / 2}\" y=\"2\" width=\"${tw}\" height=\"16\" fill=\"rgba(0,0,0,0.65)\" rx=\"3\"/>`,\n `<text x=\"${x}\" y=\"14\" text-anchor=\"middle\" fill=\"#ff6666\" font-size=\"11\" font-family=\"Consolas,monospace\" font-weight=\"bold\">${text}</text>`,\n );\n }\n\n // --- Coordinate labels along left edge ---\n for (let y = labelSpacing; y < height; y += labelSpacing) {\n const text = String(y);\n const tw = text.length * 7.5 + 6;\n svgParts.push(\n `<rect x=\"2\" y=\"${y - 8}\" width=\"${tw}\" height=\"16\" fill=\"rgba(0,0,0,0.65)\" rx=\"3\"/>`,\n `<text x=\"5\" y=\"${y + 4}\" fill=\"#ff6666\" font-size=\"11\" font-family=\"Consolas,monospace\" font-weight=\"bold\">${text}</text>`,\n );\n }\n\n // --- Origin label ---\n svgParts.push(\n `<rect x=\"2\" y=\"2\" width=\"22\" height=\"16\" fill=\"rgba(0,0,0,0.65)\" rx=\"3\"/>`,\n `<text x=\"5\" y=\"14\" fill=\"#ff6666\" font-size=\"11\" font-family=\"Consolas,monospace\" font-weight=\"bold\">0,0</text>`,\n );\n\n // --- Dimension label at bottom-right ---\n const dimText = `${width}x${height}`;\n const dimTw = dimText.length * 7.5 + 6;\n svgParts.push(\n `<rect x=\"${width - dimTw - 2}\" y=\"${height - 18}\" width=\"${dimTw}\" height=\"16\" fill=\"rgba(0,0,0,0.65)\" rx=\"3\"/>`,\n `<text x=\"${width - dimTw / 2 - 2}\" y=\"${height - 6}\" text-anchor=\"middle\" fill=\"#ff6666\" font-size=\"11\" font-family=\"Consolas,monospace\" font-weight=\"bold\">${dimText}</text>`,\n );\n\n const svg = Buffer.from(\n `<svg width=\"${width}\" height=\"${height}\" xmlns=\"http://www.w3.org/2000/svg\">${svgParts.join('')}</svg>`,\n );\n\n return sharp(imageBuffer)\n .composite([{ input: svg, top: 0, left: 0 }])\n .jpeg({ quality: 70 })\n .toBuffer();\n}\n","import { z } from 'zod';\nimport sharp from 'sharp';\nimport type { ToolDefinition } from '../types.js';\nimport { addCoordinateGrid } from './grid-overlay.js';\n\nexport const screenshotTool: ToolDefinition = {\n name: 'screenshot',\n description:\n 'Capture the full screen with a coordinate grid overlay. The grid shows pixel coordinates that match mouse_click/mouse_move coordinates. Returns a screenshot ID.',\n parameters: z.object({}),\n async execute(_args, ctx) {\n const { Monitor } = await import('node-screenshots');\n\n const monitors = Monitor.all();\n const primary = monitors.find((m: any) => m.isPrimary()) ?? monitors[0];\n if (!primary) {\n return { type: 'text', content: 'Error: No monitor found' };\n }\n\n const image = primary.captureImageSync();\n const physW = image.width;\n const physH = image.height;\n const scaleFactor: number = (primary as any).scaleFactor ?? 1;\n\n // Logical dimensions (matching OS coordinate system used by nut-js)\n const logicalW = Math.round(physW / scaleFactor);\n const logicalH = Math.round(physH / scaleFactor);\n\n // Resize to logical resolution using raw RGBA pixels\n const raw = image.toRawSync();\n const resized = await sharp(raw, {\n raw: { width: physW, height: physH, channels: 4 },\n })\n .resize(logicalW, logicalH)\n .jpeg({ quality: 70 })\n .toBuffer();\n\n // Clean version → ScreenshotStore (for report to user/main model)\n const cleanBase64 = resized.toString('base64');\n const id = ctx.screenshots.save(cleanBase64, 'image/jpeg', 'desktop');\n\n // Grid version → LLM (for coordinate reference)\n const gridImage = await addCoordinateGrid(resized, logicalW, logicalH);\n const gridBase64 = gridImage.toString('base64');\n\n return {\n type: 'image',\n base64: gridBase64,\n mimeType: 'image/jpeg',\n screenshotId: id,\n };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nasync function getNutJs() {\n return import('@nut-tree-fork/nut-js');\n}\n\nexport const mouseClickTool: ToolDefinition = {\n name: 'mouse_click',\n description: 'Click the mouse at the given screen coordinates.',\n parameters: z.object({\n x: z.number().describe('X coordinate on screen'),\n y: z.number().describe('Y coordinate on screen'),\n button: z.enum(['left', 'right', 'middle']).default('left').describe('Mouse button'),\n }),\n async execute(args) {\n const nut = await getNutJs();\n const point = new nut.Point(args.x, args.y);\n await nut.mouse.move(nut.straightTo(point));\n\n const buttonMap = {\n left: nut.Button.LEFT,\n right: nut.Button.RIGHT,\n middle: nut.Button.MIDDLE,\n };\n await nut.mouse.click(buttonMap[args.button]);\n\n return { type: 'text', content: `Clicked ${args.button} at (${args.x}, ${args.y})` };\n },\n};\n\nexport const mouseMoveTool: ToolDefinition = {\n name: 'mouse_move',\n description: 'Move the mouse to the given screen coordinates without clicking.',\n parameters: z.object({\n x: z.number().describe('X coordinate on screen'),\n y: z.number().describe('Y coordinate on screen'),\n }),\n async execute(args) {\n const nut = await getNutJs();\n const point = new nut.Point(args.x, args.y);\n await nut.mouse.move(nut.straightTo(point));\n return { type: 'text', content: `Mouse moved to (${args.x}, ${args.y})` };\n },\n};\n\nexport const mouseScrollTool: ToolDefinition = {\n name: 'mouse_scroll',\n description: 'Scroll the mouse wheel.',\n parameters: z.object({\n direction: z.enum(['up', 'down']).describe('Scroll direction'),\n amount: z.number().positive().default(3).describe('Number of scroll steps'),\n }),\n async execute(args) {\n const nut = await getNutJs();\n for (let i = 0; i < args.amount; i++) {\n if (args.direction === 'down') {\n await nut.mouse.scrollDown(1);\n } else {\n await nut.mouse.scrollUp(1);\n }\n }\n return { type: 'text', content: `Scrolled ${args.direction} ${args.amount} steps` };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nasync function getNutJs() {\n return import('@nut-tree-fork/nut-js');\n}\n\nexport const keyboardTypeTool: ToolDefinition = {\n name: 'keyboard_type',\n description: 'Type text using the keyboard. The text is typed character by character.',\n parameters: z.object({\n text: z.string().describe('The text to type'),\n }),\n async execute(args) {\n const nut = await getNutJs();\n await nut.keyboard.type(args.text);\n return { type: 'text', content: `Typed: \"${args.text}\"` };\n },\n};\n\n/**\n * Map common key names to nut-js Key enum values.\n */\nfunction resolveKey(nut: any, keyName: string): number {\n const keyMap: Record<string, string> = {\n 'ctrl': 'LeftControl',\n 'control': 'LeftControl',\n 'shift': 'LeftShift',\n 'alt': 'LeftAlt',\n 'meta': 'LeftWin',\n 'win': 'LeftWin',\n 'windows': 'LeftWin',\n 'enter': 'Return',\n 'return': 'Return',\n 'tab': 'Tab',\n 'escape': 'Escape',\n 'esc': 'Escape',\n 'backspace': 'Backspace',\n 'delete': 'Delete',\n 'space': 'Space',\n 'up': 'Up',\n 'down': 'Down',\n 'left': 'Left',\n 'right': 'Right',\n 'home': 'Home',\n 'end': 'End',\n 'pageup': 'PageUp',\n 'pagedown': 'PageDown',\n 'f1': 'F1', 'f2': 'F2', 'f3': 'F3', 'f4': 'F4',\n 'f5': 'F5', 'f6': 'F6', 'f7': 'F7', 'f8': 'F8',\n 'f9': 'F9', 'f10': 'F10', 'f11': 'F11', 'f12': 'F12',\n };\n\n const normalized = keyName.toLowerCase().trim();\n const mapped = keyMap[normalized] ?? keyName;\n\n // Try to find in the Key enum\n const key = nut.Key[mapped];\n if (key !== undefined) return key;\n\n // Try uppercase single char (e.g., 'a' -> 'A')\n if (mapped.length === 1) {\n const upper = mapped.toUpperCase();\n const k = nut.Key[upper];\n if (k !== undefined) return k;\n }\n\n throw new Error(`Unknown key: \"${keyName}\"`);\n}\n\nexport const keyboardPressTool: ToolDefinition = {\n name: 'keyboard_press',\n description: 'Press a key combination. Examples: [\"Ctrl\", \"C\"] for copy, [\"Enter\"] for enter, [\"Alt\", \"F4\"] to close window.',\n parameters: z.object({\n keys: z.array(z.string()).min(1).describe('Array of key names to press simultaneously'),\n }),\n async execute(args) {\n const nut = await getNutJs();\n const resolved = args.keys.map((k: string) => resolveKey(nut, k));\n await nut.keyboard.pressKey(...resolved);\n await nut.keyboard.releaseKey(...resolved);\n return { type: 'text', content: `Pressed: ${args.keys.join('+')}` };\n },\n};\n","import { z } from 'zod';\nimport { exec } from 'child_process';\nimport type { ToolDefinition } from '../types.js';\n\nconst MAX_OUTPUT_LENGTH = 10_000;\n\nexport const runCommandTool: ToolDefinition = {\n name: 'run_command',\n description: 'Execute a shell command and return its output. Uses PowerShell on Windows.',\n parameters: z.object({\n command: z.string().describe('The command to execute'),\n timeout: z.number().positive().default(30_000).describe('Timeout in milliseconds'),\n }),\n async execute(args) {\n return new Promise((resolve) => {\n exec(\n args.command,\n {\n timeout: args.timeout,\n maxBuffer: 1024 * 1024,\n shell: 'powershell.exe',\n windowsHide: true,\n },\n (error, stdout, stderr) => {\n let output = '';\n if (stdout) output += stdout;\n if (stderr) output += `\\n[stderr] ${stderr}`;\n if (error && error.killed) output += '\\n[timeout] Command timed out';\n else if (error) output += `\\n[exit code ${error.code}]`;\n\n // Truncate to protect context\n if (output.length > MAX_OUTPUT_LENGTH) {\n output = output.slice(0, MAX_OUTPUT_LENGTH) + '\\n...(truncated)';\n }\n\n resolve({ type: 'text', content: output.trim() || '(no output)' });\n },\n );\n });\n },\n};\n","import { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport type { ToolDefinition } from '../types.js';\n\nconst MAX_FILE_SIZE = 100_000; // chars\n\nexport const fileReadTool: ToolDefinition = {\n name: 'file_read',\n description: 'Read the contents of a file at the given path.',\n parameters: z.object({\n path: z.string().describe('Absolute path to the file'),\n }),\n async execute(args) {\n try {\n const content = await readFile(args.path, 'utf-8');\n if (content.length > MAX_FILE_SIZE) {\n return {\n type: 'text',\n content: content.slice(0, MAX_FILE_SIZE) + '\\n...(truncated)',\n };\n }\n return { type: 'text', content };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { type: 'text', content: `Error reading file: ${msg}` };\n }\n },\n};\n","import { z } from 'zod';\nimport { writeFile, mkdir } from 'fs/promises';\nimport { dirname } from 'path';\nimport type { ToolDefinition } from '../types.js';\n\nexport const fileWriteTool: ToolDefinition = {\n name: 'file_write',\n description: 'Write content to a file at the given path. Creates parent directories if needed.',\n parameters: z.object({\n path: z.string().describe('Absolute path to the file'),\n content: z.string().describe('Content to write'),\n }),\n async execute(args) {\n try {\n await mkdir(dirname(args.path), { recursive: true });\n await writeFile(args.path, args.content, 'utf-8');\n return { type: 'text', content: `File written: ${args.path}` };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { type: 'text', content: `Error writing file: ${msg}` };\n }\n },\n};\n","import { z } from 'zod';\nimport { readFileSync, existsSync } from 'fs';\nimport { extname } from 'path';\nimport type { ToolDefinition } from '../types.js';\n\nconst IMAGE_EXTS = new Set(['.png', '.jpg', '.jpeg', '.bmp', '.webp']);\n\nexport const useLocalImageTool: ToolDefinition = {\n name: 'use_local_image',\n description: 'Load a local image file and get a screenshot ID for it. Use this to reference local images in your report via [Image:img_X].',\n parameters: z.object({\n path: z.string().describe('Absolute path to the image file'),\n label: z.string().default('local').describe('Label for the image (e.g. \"chart\", \"photo\")'),\n }),\n async execute(args, ctx) {\n if (!existsSync(args.path)) {\n return { type: 'text', content: `Error: File not found: ${args.path}` };\n }\n\n const ext = extname(args.path).toLowerCase();\n if (!IMAGE_EXTS.has(ext)) {\n return { type: 'text', content: `Error: Not a supported image format (${ext}). Supported: ${[...IMAGE_EXTS].join(', ')}` };\n }\n\n const buf = readFileSync(args.path);\n const mimeType = (ext === '.png') ? 'image/png' as const : 'image/jpeg' as const;\n const base64 = buf.toString('base64');\n const id = ctx.screenshots.save(base64, mimeType, args.label);\n\n return {\n type: 'image',\n base64,\n mimeType,\n screenshotId: id,\n };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const browserNavigateTool: ToolDefinition = {\n name: 'browser_navigate',\n description: 'Navigate the browser to a URL.',\n parameters: z.object({\n url: z.string().describe('The URL to navigate to'),\n }),\n async execute(args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n await page.goto(args.url, { waitUntil: 'domcontentloaded', timeout: 30_000 });\n const title = await page.title();\n return { type: 'text', content: `Navigated to: ${args.url}\\nPage title: ${title}` };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const browserClickTool: ToolDefinition = {\n name: 'browser_click',\n description: 'Click an element on the web page using a CSS selector or text content.',\n parameters: z.object({\n selector: z.string().describe('CSS selector or text to find the element (e.g., \"button.submit\", \"text=Login\")'),\n }),\n async execute(args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n await page.click(args.selector, { timeout: 10_000 });\n return { type: 'text', content: `Clicked element: ${args.selector}` };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const browserTypeTool: ToolDefinition = {\n name: 'browser_type',\n description: 'Type text into an input field on the web page.',\n parameters: z.object({\n selector: z.string().describe('CSS selector for the input element'),\n text: z.string().describe('Text to type'),\n clear: z.boolean().default(true).describe('Whether to clear the field before typing'),\n }),\n async execute(args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n if (args.clear) {\n await page.fill(args.selector, args.text, { timeout: 10_000 });\n } else {\n await page.type(args.selector, args.text, { timeout: 10_000 });\n }\n return { type: 'text', content: `Typed \"${args.text}\" into ${args.selector}` };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const browserScreenshotTool: ToolDefinition = {\n name: 'browser_screenshot',\n description: 'Take a screenshot of the current browser page. Returns a screenshot ID (e.g. img_2) that you can reference later in report.',\n parameters: z.object({\n fullPage: z.boolean().default(false).describe('Whether to capture the full scrollable page'),\n }),\n async execute(args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n const buf = await page.screenshot({\n type: 'jpeg',\n quality: 70,\n fullPage: args.fullPage,\n scale: 'css',\n });\n const base64 = buf.toString('base64');\n const id = ctx.screenshots.save(base64, 'image/jpeg', 'browser');\n\n return {\n type: 'image',\n base64,\n mimeType: 'image/jpeg',\n screenshotId: id,\n };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nconst MAX_CONTENT_LENGTH = 20_000;\n\nexport const browserContentTool: ToolDefinition = {\n name: 'browser_content',\n description: 'Get the text content of the current web page. Returns visible text, not HTML.',\n parameters: z.object({}),\n async execute(_args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n const url = page.url();\n const title = await page.title();\n let text = await page.innerText('body').catch(() => '');\n\n if (text.length > MAX_CONTENT_LENGTH) {\n text = text.slice(0, MAX_CONTENT_LENGTH) + '\\n...(truncated)';\n }\n\n return {\n type: 'text',\n content: `URL: ${url}\\nTitle: ${title}\\n\\n${text}`,\n };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const browserScrollTool: ToolDefinition = {\n name: 'browser_scroll',\n description: 'Scroll the current web page.',\n parameters: z.object({\n direction: z.enum(['up', 'down']).describe('Scroll direction'),\n amount: z.number().positive().default(500).describe('Pixels to scroll'),\n }),\n async execute(args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n const delta = args.direction === 'down' ? args.amount : -args.amount;\n await page.evaluate((d: number) => window.scrollBy(0, d), delta);\n return { type: 'text', content: `Scrolled ${args.direction} ${args.amount}px` };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const reportTool: ToolDefinition = {\n name: 'report',\n description:\n 'Report progress back to the caller. Call this when the task is completed, when you are blocked, or when you need guidance. Calling this STOPS your execution immediately.\\n\\nThe content field supports rich document format: mix text with screenshots using [Image:img_1] markers. Example:\\n\"Here is the current state:\\n[Image:img_2]\\nThe page shows...\"',\n parameters: z.object({\n status: z\n .enum(['completed', 'blocked', 'need_guidance'])\n .describe(\n '\"completed\" = task done, \"blocked\" = cannot proceed, \"need_guidance\" = need a decision',\n ),\n content: z\n .string()\n .describe('Rich report content. Use [Image:img_X] to embed screenshots captured earlier. Example: \"Task done.\\\\n[Image:img_1]\\\\nThe page shows the result.\"'),\n data: z.unknown().optional().describe('Optional structured data to return'),\n }),\n async execute(args) {\n return {\n type: 'report',\n status: args.status,\n content: args.content,\n data: args.data,\n };\n },\n};\n","import { ToolRegistry } from './registry.js';\nimport { screenshotTool } from './windows/screenshot.js';\nimport { mouseClickTool, mouseMoveTool, mouseScrollTool } from './windows/mouse.js';\nimport { keyboardTypeTool, keyboardPressTool } from './windows/keyboard.js';\nimport { runCommandTool } from './windows/command.js';\nimport { fileReadTool } from './file/read.js';\nimport { fileWriteTool } from './file/write.js';\nimport { useLocalImageTool } from './file/image.js';\nimport { browserNavigateTool } from './browser/navigate.js';\nimport { browserClickTool } from './browser/click.js';\nimport { browserTypeTool } from './browser/type.js';\nimport { browserScreenshotTool } from './browser/screenshot.js';\nimport { browserContentTool } from './browser/content.js';\nimport { browserScrollTool } from './browser/scroll.js';\nimport { reportTool } from './control/report.js';\n\nexport function createToolRegistry(): ToolRegistry {\n const registry = new ToolRegistry();\n\n // Windows tools\n registry.register(screenshotTool);\n registry.register(mouseClickTool);\n registry.register(mouseMoveTool);\n registry.register(mouseScrollTool);\n registry.register(keyboardTypeTool);\n registry.register(keyboardPressTool);\n registry.register(runCommandTool);\n\n // File tools\n registry.register(fileReadTool);\n registry.register(fileWriteTool);\n registry.register(useLocalImageTool);\n\n // Browser tools\n registry.register(browserNavigateTool);\n registry.register(browserClickTool);\n registry.register(browserTypeTool);\n registry.register(browserScreenshotTool);\n registry.register(browserContentTool);\n registry.register(browserScrollTool);\n\n // Control tools\n registry.register(reportTool);\n\n return registry;\n}\n","import type { z } from 'zod';\n\nexport interface StoredScreenshot {\n id: string;\n base64: string;\n mimeType: 'image/png' | 'image/jpeg';\n label: string; // e.g. \"desktop\", \"browser\"\n}\n\n/**\n * Simple in-memory screenshot store.\n * Screenshot tools save images here with auto-incrementing IDs.\n * Report content references them via [Image:img_1] markers.\n */\nexport class ScreenshotStore {\n private counter = 0;\n private store = new Map<string, StoredScreenshot>();\n\n save(base64: string, mimeType: 'image/png' | 'image/jpeg', label: string): string {\n this.counter++;\n const id = `img_${this.counter}`;\n this.store.set(id, { id, base64, mimeType, label });\n return id;\n }\n\n get(id: string): StoredScreenshot | undefined {\n return this.store.get(id);\n }\n\n listIds(): string[] {\n return [...this.store.keys()];\n }\n}\n\n/** A block in parsed report content */\nexport type ContentBlock =\n | { type: 'text'; text: string }\n | { type: 'image'; id: string; base64: string; mimeType: 'image/png' | 'image/jpeg'; label: string };\n\n/**\n * Parse report content string, expanding [Image:img_X] markers into image blocks.\n * Returns an array of text and image content blocks.\n */\nexport function parseReportContent(content: string, store: ScreenshotStore): ContentBlock[] {\n const blocks: ContentBlock[] = [];\n const regex = /\\[Image:(img_\\d+)\\]/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(content)) !== null) {\n // Text before the marker\n if (match.index > lastIndex) {\n blocks.push({ type: 'text', text: content.slice(lastIndex, match.index) });\n }\n\n const id = match[1];\n const screenshot = store.get(id);\n if (screenshot) {\n blocks.push({\n type: 'image',\n id: screenshot.id,\n base64: screenshot.base64,\n mimeType: screenshot.mimeType,\n label: screenshot.label,\n });\n } else {\n // Unknown ID — keep as text\n blocks.push({ type: 'text', text: match[0] });\n }\n\n lastIndex = regex.lastIndex;\n }\n\n // Remaining text after last marker\n if (lastIndex < content.length) {\n blocks.push({ type: 'text', text: content.slice(lastIndex) });\n }\n\n return blocks;\n}\n\n/** Strip [Image:...] markers, returning text-only content */\nexport function stripImageMarkers(content: string): string {\n return content.replace(/\\[Image:img_\\d+\\]/g, '').replace(/\\n{3,}/g, '\\n\\n').trim();\n}\n\nexport interface ToolContext {\n sessionId: string;\n cdpUrl: string;\n /** Lazy browser client getter — only connects on first call */\n getBrowser: () => Promise<import('./browser/client.js').BrowserClient>;\n /** Screenshot store — tools save screenshots here, report references by [Image:id] */\n screenshots: ScreenshotStore;\n}\n\nexport type ToolResult =\n | { type: 'text'; content: string }\n | { type: 'image'; base64: string; mimeType: 'image/png' | 'image/jpeg'; screenshotId: string }\n | {\n type: 'report';\n status: 'completed' | 'blocked' | 'need_guidance';\n content: string; // Rich content with [Image:img_1] markers\n data?: unknown;\n };\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n parameters: z.ZodType;\n execute(args: any, context: ToolContext): Promise<ToolResult>;\n}\n","import crypto from 'crypto';\nimport type { Config } from '../config/schema.js';\nimport { ContextManager } from '../agent/context-manager.js';\nimport { LLMClient } from '../agent/llm-client.js';\nimport { AgentRunner } from '../agent/runner.js';\nimport { BrowserClient } from '../tools/browser/client.js';\nimport { createToolRegistry } from '../tools/index.js';\nimport { ScreenshotStore, type ToolContext } from '../tools/types.js';\n\nexport interface Session {\n id: string;\n createdAt: Date;\n lastActivityAt: Date;\n config: Config;\n runner: AgentRunner;\n browserClient: BrowserClient;\n screenshots: ScreenshotStore;\n timeoutHandle: ReturnType<typeof setTimeout>;\n}\n\nexport class SessionRegistry {\n private sessions = new Map<string, Session>();\n\n create(config: Config): Session {\n const id = crypto.randomUUID();\n const contextManager = new ContextManager();\n const llmClient = new LLMClient(config);\n const browserClient = new BrowserClient(config.cdpUrl);\n const toolRegistry = createToolRegistry();\n const screenshotStore = new ScreenshotStore();\n\n const toolContext: ToolContext = {\n sessionId: id,\n cdpUrl: config.cdpUrl,\n getBrowser: () => {\n // Lazy connection\n return browserClient.connect().then(() => browserClient);\n },\n screenshots: screenshotStore,\n };\n\n const runner = new AgentRunner(\n llmClient,\n contextManager,\n toolRegistry,\n config,\n toolContext,\n );\n\n const timeoutHandle = setTimeout(\n () => this.destroy(id),\n config.timeoutMs,\n );\n\n const session: Session = {\n id,\n createdAt: new Date(),\n lastActivityAt: new Date(),\n config,\n runner,\n browserClient,\n screenshots: screenshotStore,\n timeoutHandle,\n };\n\n this.sessions.set(id, session);\n return session;\n }\n\n get(id: string): Session | undefined {\n return this.sessions.get(id);\n }\n\n touch(id: string): void {\n const session = this.sessions.get(id);\n if (!session) return;\n session.lastActivityAt = new Date();\n clearTimeout(session.timeoutHandle);\n session.timeoutHandle = setTimeout(\n () => this.destroy(id),\n session.config.timeoutMs,\n );\n }\n\n async destroy(id: string): Promise<void> {\n const session = this.sessions.get(id);\n if (!session) return;\n clearTimeout(session.timeoutHandle);\n await session.browserClient.close().catch(() => {});\n this.sessions.delete(id);\n }\n\n async destroyAll(): Promise<void> {\n await Promise.allSettled(\n [...this.sessions.keys()].map((id) => this.destroy(id)),\n );\n }\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { SessionRegistry } from './session-registry.js';\nimport { loadConfig } from '../config/loader.js';\nimport { parseReportContent } from '../tools/types.js';\n\nexport function registerMcpTools(\n server: McpServer,\n registry: SessionRegistry,\n): void {\n // Tool 1: create_session\n server.tool(\n 'create_session',\n 'Create a new automation session with a small LLM agent. Returns a session_id.',\n {\n api_key: z.string().optional().describe('LLM API key (or set WINDOWS_USE_API_KEY env)'),\n base_url: z.string().optional().describe('OpenAI-compatible base URL (or set WINDOWS_USE_BASE_URL env)'),\n model: z.string().optional().describe('Model name (or set WINDOWS_USE_MODEL env)'),\n cdp_url: z.string().optional().describe('Chrome CDP URL (default: http://localhost:9222)'),\n timeout_ms: z.number().optional().describe('Session inactivity timeout in ms (default: 300000)'),\n max_steps: z.number().optional().describe('Max tool-calling steps per instruction (default: 50)'),\n max_rounds: z.number().optional().describe('Max instruction rounds per session (default: 20)'),\n },\n async (args) => {\n const config = loadConfig({\n apiKey: args.api_key,\n baseURL: args.base_url,\n model: args.model,\n cdpUrl: args.cdp_url,\n timeoutMs: args.timeout_ms,\n maxSteps: args.max_steps,\n maxRounds: args.max_rounds,\n });\n\n const session = registry.create(config);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ session_id: session.id }),\n },\n ],\n };\n },\n );\n\n // Tool 2: send_instruction\n server.tool(\n 'send_instruction',\n 'Send a task instruction to the agent in a session. The agent executes it and returns a rich report with text and images.',\n {\n session_id: z.string().describe('Session ID from create_session'),\n instruction: z.string().describe('What you want the agent to do, in natural language'),\n },\n async (args) => {\n const session = registry.get(args.session_id);\n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: `Session \"${args.session_id}\" not found or expired`,\n }),\n },\n ],\n isError: true,\n };\n }\n\n registry.touch(args.session_id);\n\n const result = await session.runner.run(args.instruction);\n\n registry.touch(args.session_id);\n\n // Build multimodal MCP response by expanding [Image:id] markers\n const mcpContent: Array<{ type: string; text?: string; data?: string; mimeType?: string }> = [];\n\n // Metadata header\n mcpContent.push({\n type: 'text',\n text: JSON.stringify({\n status: result.status,\n steps_used: result.stepsUsed,\n round: session.runner.currentRound,\n rounds_remaining: session.config.maxRounds - session.runner.currentRound,\n ...(result.data !== undefined ? { data: result.data } : {}),\n }),\n });\n\n // Expand report content: [Image:img_X] markers → actual image blocks\n const blocks = parseReportContent(result.content, session.screenshots);\n for (const block of blocks) {\n if (block.type === 'text') {\n mcpContent.push({ type: 'text', text: block.text });\n } else {\n mcpContent.push({\n type: 'image',\n data: block.base64,\n mimeType: block.mimeType,\n });\n }\n }\n\n return { content: mcpContent as any };\n },\n );\n\n // Tool 3: done_session\n server.tool(\n 'done_session',\n 'Terminate a session and free all resources.',\n {\n session_id: z.string().describe('Session ID to terminate'),\n },\n async (args) => {\n await registry.destroy(args.session_id);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ success: true }),\n },\n ],\n };\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { SessionRegistry } from './session-registry.js';\nimport { registerMcpTools } from './tools.js';\n\nconst server = new McpServer({\n name: 'windows-use',\n version: '0.1.0',\n});\n\nconst registry = new SessionRegistry();\n\nregisterMcpTools(server, registry);\n\n// Graceful shutdown\nasync function shutdown() {\n await registry.destroyAll();\n process.exit(0);\n}\n\nprocess.on('SIGINT', shutdown);\nprocess.on('SIGTERM', shutdown);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n\n// Use stderr for logging — stdout is reserved for JSON-RPC\nconsole.error('[windows-use] MCP server started');\n","#!/usr/bin/env node\n\nimport { program } from 'commander';\nimport { createInterface } from 'readline';\nimport { createServer } from 'http';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\nimport { loadConfig, getConfigPath } from './config/loader.js';\nimport { SessionRegistry } from './mcp/session-registry.js';\nimport type { RunResult, StepEvent } from './agent/runner.js';\nimport { parseReportContent } from './tools/types.js';\n\n/** Tiny static file server for screenshots (node:http, zero deps) */\nfunction startScreenshotServer(screenshotDir: string): Promise<{ port: number; save: (base64: string) => string }> {\n let counter = 0;\n const files = new Map<string, Buffer>();\n\n return new Promise((resolve) => {\n const server = createServer((req, res) => {\n const name = req.url?.slice(1) ?? '';\n const buf = files.get(name);\n if (buf) {\n const ct = name.endsWith('.jpg') ? 'image/jpeg' : 'image/png';\n res.writeHead(200, { 'Content-Type': ct });\n res.end(buf);\n } else {\n // Index page — list all screenshots\n res.writeHead(200, { 'Content-Type': 'text/html' });\n const links = [...files.keys()]\n .map((f) => `<a href=\"/${f}\"><img src=\"/${f}\" style=\"max-width:400px;margin:8px\"></a>`)\n .join('\\n');\n res.end(`<html><body style=\"background:#1a1a1a;display:flex;flex-wrap:wrap\">${links}</body></html>`);\n }\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address();\n const port = typeof addr === 'object' && addr ? addr.port : 0;\n\n const save = (base64: string): string => {\n counter++;\n const name = `screenshot-${counter}.jpg`;\n const buf = Buffer.from(base64, 'base64');\n files.set(name, buf);\n // Also save to disk\n const filePath = join(screenshotDir, name);\n writeFileSync(filePath, buf);\n return `http://127.0.0.1:${port}/${name}`;\n };\n\n resolve({ port, save });\n });\n });\n}\n\nprogram\n .name('windows-use')\n .description('Run Windows/browser automation tasks using a small LLM agent')\n .version('0.2.0');\n\n// init command\nprogram\n .command('init')\n .description('Interactive setup — save config to ~/.windows-use.json')\n .action(async () => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const ask = (q: string): Promise<string> =>\n new Promise((resolve) => rl.question(q, (a) => resolve(a.trim())));\n\n console.log('\\n🔧 windows-use setup\\n');\n\n const baseURL = await ask('Base URL (OpenAI-compatible endpoint): ');\n const apiKey = await ask('API Key: ');\n const model = await ask('Model name (e.g. qwen3.5-flash): ');\n\n rl.close();\n\n const config: Record<string, string> = {};\n if (baseURL) config.baseURL = baseURL;\n if (apiKey) config.apiKey = apiKey;\n if (model) config.model = model;\n\n const configPath = getConfigPath();\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n console.log(`\\n✅ Config saved to ${configPath}`);\n console.log('You can now run: windows-use \"your task here\"\\n');\n });\n\n// default command — run a task\nprogram\n .argument('[instruction]', 'The task to perform')\n .option('--api-key <key>', 'LLM API key')\n .option('--base-url <url>', 'OpenAI-compatible base URL')\n .option('--model <name>', 'Model name')\n .option('--cdp-url <url>', 'Chrome CDP URL (default: http://localhost:9222)')\n .option('--max-steps <n>', 'Max tool-calling steps per instruction', parseInt)\n .option('--max-rounds <n>', 'Max instruction rounds per session', parseInt)\n .option('--mcp', 'Start as MCP server instead of running a task')\n .action(async (instruction: string | undefined, opts: any) => {\n if (opts.mcp) {\n await import('./mcp/server.js');\n return;\n }\n\n let config;\n try {\n config = loadConfig({\n apiKey: opts.apiKey,\n baseURL: opts.baseUrl,\n model: opts.model,\n cdpUrl: opts.cdpUrl,\n maxSteps: opts.maxSteps,\n maxRounds: opts.maxRounds,\n });\n } catch (err) {\n console.error(\n 'Configuration error. Run `windows-use init` to set up, or pass --api-key, --base-url, --model flags.',\n );\n console.error(err instanceof Error ? err.message : err);\n process.exit(1);\n }\n\n // Set up screenshot server\n const screenshotDir = join(tmpdir(), 'windows-use-screenshots');\n mkdirSync(screenshotDir, { recursive: true });\n const { port, save: saveScreenshot } = await startScreenshotServer(screenshotDir);\n\n const registry = new SessionRegistry();\n const session = registry.create(config);\n\n // Hook step-by-step progress display\n session.runner.setOnStep((event: StepEvent) => {\n const prefix = ` [step ${event.step}]`;\n switch (event.type) {\n case 'thinking':\n console.log(`${prefix} 💭 ${event.content}`);\n break;\n case 'tool_call': {\n const argsStr = typeof event.args === 'object'\n ? JSON.stringify(event.args, null, 0)\n : String(event.args);\n const preview = argsStr.length > 120 ? argsStr.slice(0, 120) + '...' : argsStr;\n console.log(`${prefix} 🔧 ${event.name}(${preview})`);\n break;\n }\n case 'tool_result':\n console.log(`${prefix} ✓ ${event.name} → ${event.result}`);\n break;\n case 'error':\n console.log(`${prefix} ✗ ${event.message}`);\n break;\n }\n });\n\n console.log(`\\n[windows-use] Session ${session.id} created`);\n console.log(`[windows-use] Model: ${config.model}`);\n console.log(`[windows-use] Screenshots: http://127.0.0.1:${port}`);\n console.log(`[windows-use] Type \"exit\" or Ctrl+C to quit.\\n`);\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const ask = (prompt: string): Promise<string> =>\n new Promise((resolve) => rl.question(prompt, (a) => resolve(a.trim())));\n\n let nextInstruction = instruction ?? '';\n\n const printResult = (result: RunResult) => {\n const statusIcon = result.status === 'completed' ? '✅' :\n result.status === 'blocked' ? '🚫' : '❓';\n console.log(`\\n${statusIcon} [${result.status}]`);\n\n // Expand [Image:img_X] markers → screenshot URLs\n const blocks = parseReportContent(result.content, session.screenshots);\n for (const block of blocks) {\n if (block.type === 'text') {\n process.stdout.write(block.text);\n } else {\n const url = saveScreenshot(block.base64);\n process.stdout.write(`\\n 📸 ${block.label}: ${url}\\n`);\n }\n }\n\n if (result.data) {\n console.log(`\\n Data: ${JSON.stringify(result.data)}`);\n }\n const roundInfo = `round ${session.runner.currentRound}/${config.maxRounds}`;\n console.log(`\\n (${result.stepsUsed} steps, ${roundInfo})\\n`);\n };\n\n try {\n while (true) {\n if (!nextInstruction) {\n nextInstruction = await ask('> ');\n } else {\n console.log(`> ${nextInstruction}`);\n }\n\n if (!nextInstruction || nextInstruction.toLowerCase() === 'exit') {\n break;\n }\n\n if (session.runner.roundsExhausted) {\n console.log(`[windows-use] Session reached max rounds (${config.maxRounds}). Type \"exit\" to quit.\\n`);\n nextInstruction = '';\n continue;\n }\n\n console.log('[windows-use] Running...\\n');\n const result = await session.runner.run(nextInstruction);\n printResult(result);\n\n nextInstruction = '';\n }\n } catch (err) {\n console.error('\\nFatal error:', err instanceof Error ? err.message : err);\n } finally {\n rl.close();\n await registry.destroyAll();\n console.log('[windows-use] Session ended.');\n process.exit(0);\n }\n });\n\nprogram.parse();\n"],"mappings":"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","names":["existsSync","join","homedir","z","sharp","z","z","getNutJs","z","z","z","z","readFileSync","existsSync","z","z","z","z","init_screenshot","z","z","z","registry","init_screenshot","z","server","registry","init_tools","init_tools","mkdirSync","join","server","registry"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/schema.ts","../src/config/loader.ts","../src/agent/context-manager.ts","../src/agent/llm-client.ts","../src/agent/system-prompt.ts","../src/agent/runner.ts","../src/tools/browser/client.ts","../src/tools/zod-to-json.ts","../src/tools/registry.ts","../src/tools/windows/grid-overlay.ts","../src/tools/windows/screenshot.ts","../src/tools/windows/mouse.ts","../src/tools/windows/keyboard.ts","../src/tools/windows/command.ts","../src/tools/file/read.ts","../src/tools/file/write.ts","../src/tools/file/image.ts","../src/tools/browser/navigate.ts","../src/tools/browser/click.ts","../src/tools/browser/type.ts","../src/tools/browser/screenshot.ts","../src/tools/browser/content.ts","../src/tools/browser/scroll.ts","../src/tools/control/report.ts","../src/tools/index.ts","../src/tools/types.ts","../src/mcp/session-registry.ts","../src/mcp/tools.ts","../src/mcp/server.ts","../src/cli.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const ConfigSchema = z.object({\n apiKey: z.string().min(1, 'API key is required'),\n baseURL: z.string().url('Must be a valid URL'),\n model: z.string().min(1, 'Model name is required'),\n maxSteps: z.number().int().positive().default(50),\n maxRounds: z.number().int().positive().default(20),\n cdpUrl: z.string().default('http://localhost:9222'),\n timeoutMs: z.number().default(300_000),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n","import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { ConfigSchema, type Config } from './schema.js';\n\nconst CONFIG_FILE = join(homedir(), '.windows-use.json');\n\nexport interface FileConfig {\n apiKey?: string;\n baseURL?: string;\n model?: string;\n maxSteps?: number;\n maxRounds?: number;\n cdpUrl?: string;\n timeoutMs?: number;\n}\n\n/** Load saved config from ~/.windows-use.json */\nexport function loadFileConfig(): FileConfig {\n if (!existsSync(CONFIG_FILE)) return {};\n try {\n return JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n\n/**\n * Load config with priority: overrides > env vars > config file > defaults\n */\nexport function loadConfig(overrides?: Partial<Config>): Config {\n const file = loadFileConfig();\n\n const raw = {\n apiKey: overrides?.apiKey ?? process.env.WINDOWS_USE_API_KEY ?? file.apiKey ?? '',\n baseURL: overrides?.baseURL ?? process.env.WINDOWS_USE_BASE_URL ?? file.baseURL ?? '',\n model: overrides?.model ?? process.env.WINDOWS_USE_MODEL ?? file.model ?? '',\n maxSteps: overrides?.maxSteps ?? intEnv('WINDOWS_USE_MAX_STEPS') ?? file.maxSteps ?? 50,\n maxRounds: overrides?.maxRounds ?? intEnv('WINDOWS_USE_MAX_ROUNDS') ?? file.maxRounds ?? 20,\n cdpUrl: overrides?.cdpUrl ?? process.env.WINDOWS_USE_CDP_URL ?? file.cdpUrl ?? 'http://localhost:9222',\n timeoutMs: overrides?.timeoutMs ?? intEnv('WINDOWS_USE_TIMEOUT_MS') ?? file.timeoutMs ?? 300_000,\n };\n\n return ConfigSchema.parse(raw);\n}\n\nfunction intEnv(name: string): number | undefined {\n const val = process.env[name];\n if (val === undefined) return undefined;\n const n = parseInt(val, 10);\n return isNaN(n) ? undefined : n;\n}\n","import type OpenAI from 'openai';\n\ntype Message = OpenAI.Chat.Completions.ChatCompletionMessageParam;\n\n/**\n * Simple message history — stores all messages without windowing.\n * Small models are cheap, no need to truncate context.\n */\nexport class ContextManager {\n private messages: Message[] = [];\n\n append(message: Message): void {\n this.messages.push(message);\n }\n\n /** Returns all messages. */\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n /** Total messages stored. */\n get length(): number {\n return this.messages.length;\n }\n}\n","import OpenAI from 'openai';\nimport type { Config } from '../config/schema.js';\n\nexport class LLMClient {\n private client: OpenAI;\n private model: string;\n\n constructor(config: Config) {\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseURL,\n });\n this.model = config.model;\n }\n\n async chat(\n messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n tools: OpenAI.Chat.Completions.ChatCompletionTool[],\n ): Promise<OpenAI.Chat.Completions.ChatCompletion> {\n return this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: tools.length > 0 ? tools : undefined,\n tool_choice: tools.length > 0 ? 'auto' : undefined,\n });\n }\n}\n","export function buildSystemPrompt(): string {\n return `You are a precise Windows and browser automation agent. Your job is to execute instructions by calling the tools available to you.\n\n## Workflow\n1. Take a screenshot first to understand the current state of the screen.\n2. Plan the minimal sequence of actions needed.\n3. Execute each action one at a time, then verify by taking another screenshot.\n4. When the task is done, you are blocked, or you need guidance, call \\`report\\` immediately.\n\n## Rules\n- ALWAYS take a screenshot before your first action to understand the current state.\n- After every mouse click or keyboard action, take a screenshot to verify the result.\n- Call ONE tool at a time. Never request multiple tools in parallel.\n- Before each tool call, briefly state what you are about to do and why.\n- After receiving a tool result, describe what you observed.\n- For browser tasks, prefer using browser_* tools over clicking on-screen coordinates.\n- For terminal tasks, prefer \\`run_command\\` over GUI interactions when possible.\n- Do not read or write files unless the instruction explicitly asks for it.\n\n## report Tool\nCall \\`report\\` when:\n- **\"completed\"**: The task is done successfully. Summarize what was accomplished.\n- **\"blocked\"**: You cannot proceed (CAPTCHA, login wall, unexpected error). Explain what's blocking you.\n- **\"need_guidance\"**: You need a decision or clarification. Describe what you need.\n\nCalling \\`report\\` stops your execution. The \\`content\\` field supports a rich document format — mix text with screenshots using \\`[Image:img_X]\\` markers:\n\n\\`\\`\\`\nreport({\n status: \"completed\",\n content: \"Here is what I found:\\\\n[Image:img_2]\\\\nThe page shows the search results.\\\\n[Image:img_3]\\\\nI also checked the sidebar.\"\n})\n\\`\\`\\`\n\nEach screenshot tool returns a screenshot ID (e.g. img_1, img_2). Use these IDs to embed images in your report.\n\n## Important\n- Do NOT keep retrying the same failing action. If something fails twice, call \\`report\\` with status \"blocked\".\n- If a UI element is not where you expect it, try scrolling first before giving up.\n- Keep your responses concise. Focus on actions, not explanations.`;\n}\n","import type OpenAI from 'openai';\nimport type { Config } from '../config/schema.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { ToolContext, ToolResult } from '../tools/types.js';\nimport { ContextManager } from './context-manager.js';\nimport { LLMClient } from './llm-client.js';\nimport { buildSystemPrompt } from './system-prompt.js';\n\nexport interface RunResult {\n status: 'completed' | 'blocked' | 'need_guidance';\n /** Rich content with [Image:img_X] markers. Use parseReportContent() to expand. */\n content: string;\n data?: unknown;\n stepsUsed: number;\n}\n\nexport type StepEvent =\n | { type: 'thinking'; step: number; content: string }\n | { type: 'tool_call'; step: number; name: string; args: unknown }\n | { type: 'tool_result'; step: number; name: string; result: string }\n | { type: 'error'; step: number; message: string };\n\nexport type OnStepCallback = (event: StepEvent) => void;\n\nexport class AgentRunner {\n private llmClient: LLMClient;\n private contextManager: ContextManager;\n private toolRegistry: ToolRegistry;\n private config: Config;\n private toolContext: ToolContext;\n private initialized = false;\n private onStep: OnStepCallback | null = null;\n private roundsUsed = 0;\n\n constructor(\n llmClient: LLMClient,\n contextManager: ContextManager,\n toolRegistry: ToolRegistry,\n config: Config,\n toolContext: ToolContext,\n ) {\n this.llmClient = llmClient;\n this.contextManager = contextManager;\n this.toolRegistry = toolRegistry;\n this.config = config;\n this.toolContext = toolContext;\n }\n\n /** Register a callback to receive step-by-step progress events */\n setOnStep(cb: OnStepCallback): void {\n this.onStep = cb;\n }\n\n private emit(event: StepEvent): void {\n this.onStep?.(event);\n }\n\n /** How many instruction rounds have been used in this session */\n get currentRound(): number {\n return this.roundsUsed;\n }\n\n /** Whether this session has exhausted its max rounds */\n get roundsExhausted(): boolean {\n return this.roundsUsed >= this.config.maxRounds;\n }\n\n async run(instruction: string): Promise<RunResult> {\n // Check round limit\n if (this.roundsExhausted) {\n return {\n status: 'blocked',\n content: `Session has reached the maximum number of instruction rounds (${this.config.maxRounds}). Create a new session to continue.`,\n stepsUsed: 0,\n };\n }\n\n this.roundsUsed++;\n\n // Inject system prompt on first run\n if (!this.initialized) {\n this.contextManager.append({\n role: 'system',\n content: buildSystemPrompt(),\n });\n this.initialized = true;\n }\n\n // Add the instruction as a user message\n this.contextManager.append({\n role: 'user',\n content: instruction,\n });\n\n let stepsUsed = 0;\n\n while (stepsUsed < this.config.maxSteps) {\n stepsUsed++;\n const remaining = this.config.maxSteps - stepsUsed;\n\n const messages = this.contextManager.getMessages();\n\n // Warn the model when steps are running low\n if (remaining <= 3 && remaining >= 0) {\n messages.push({\n role: 'system',\n content: `⚠️ You have ${remaining} steps remaining. Call \\`report\\` NOW to summarize your progress. If you do not call report, your work will be lost.`,\n });\n }\n\n const tools = this.toolRegistry.toOpenAIFormat();\n\n let response: OpenAI.Chat.Completions.ChatCompletion;\n try {\n response = await this.llmClient.chat(messages, tools);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.emit({ type: 'error', step: stepsUsed, message: `LLM API error: ${msg}` });\n return {\n status: 'blocked',\n content: `LLM API error: ${msg}`,\n stepsUsed,\n };\n }\n\n const choice = response.choices[0];\n if (!choice) {\n return {\n status: 'blocked',\n content: 'LLM returned empty response',\n stepsUsed,\n };\n }\n\n const message = choice.message;\n\n // If model has text content (thinking), emit it\n if (message.content) {\n this.emit({ type: 'thinking', step: stepsUsed, content: message.content });\n }\n\n // If model stops without tool calls, treat as implicit report\n if (choice.finish_reason === 'stop' || !message.tool_calls?.length) {\n const text = message.content ?? '';\n this.contextManager.append({ role: 'assistant', content: text });\n return {\n status: 'need_guidance',\n content: text || 'Agent stopped without calling report.',\n stepsUsed,\n };\n }\n\n // Append assistant message with tool_calls to history\n this.contextManager.append(message as any);\n\n // Process tool calls sequentially\n for (const toolCall of message.tool_calls) {\n const toolName = toolCall.function.name;\n let args: unknown;\n try {\n args = JSON.parse(toolCall.function.arguments);\n } catch {\n this.emit({ type: 'error', step: stepsUsed, message: `Failed to parse args for ${toolName}` });\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: 'Error: could not parse tool arguments as JSON',\n });\n continue;\n }\n\n this.emit({ type: 'tool_call', step: stepsUsed, name: toolName, args });\n\n let result: ToolResult;\n try {\n result = await this.toolRegistry.execute(\n toolName,\n args,\n this.toolContext,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.emit({ type: 'error', step: stepsUsed, message: `${toolName} failed: ${msg}` });\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: `Error executing tool: ${msg}`,\n });\n continue;\n }\n\n // Check for report signal — the only clean exit\n if (result.type === 'report') {\n this.emit({ type: 'tool_result', step: stepsUsed, name: toolName, result: `[${result.status}] report submitted` });\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: 'Report submitted. Returning control to caller.',\n });\n return {\n status: result.status,\n content: result.content,\n data: result.data,\n stepsUsed,\n };\n }\n\n // Image results: send as multimodal content with screenshot ID\n if (result.type === 'image') {\n this.emit({ type: 'tool_result', step: stepsUsed, name: toolName, result: `Screenshot captured (${result.screenshotId})` });\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: [\n { type: 'text', text: `Screenshot captured. ID: ${result.screenshotId}` },\n {\n type: 'image_url',\n image_url: {\n url: `data:${result.mimeType};base64,${result.base64}`,\n },\n },\n ],\n } as any);\n } else {\n // Text results — truncate for display\n const preview = result.content.length > 200\n ? result.content.slice(0, 200) + '...'\n : result.content;\n this.emit({ type: 'tool_result', step: stepsUsed, name: toolName, result: preview });\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: result.content,\n });\n }\n }\n }\n\n // Max steps exceeded\n return {\n status: 'blocked',\n content: `Exceeded maximum steps limit (${this.config.maxSteps}). Task may be incomplete.`,\n stepsUsed,\n };\n }\n}\n","import type { Browser, BrowserContext, Page } from 'playwright';\nimport { existsSync, mkdirSync, cpSync, readdirSync } from 'fs';\nimport { spawn, execSync, type ChildProcess } from 'child_process';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\n/** Common Chrome paths on Windows / macOS / Linux */\nconst CHROME_PATHS = [\n // Windows\n 'C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n 'C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n `${process.env.LOCALAPPDATA ?? ''}\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe`,\n // macOS\n '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n // Linux\n '/usr/bin/google-chrome',\n '/usr/bin/google-chrome-stable',\n '/usr/bin/chromium-browser',\n '/usr/bin/chromium',\n];\n\n/** Directories to skip when copying profile (large caches, not needed for login state) */\nconst SKIP_DIRS = new Set([\n 'Cache',\n 'Code Cache',\n 'GPUCache',\n 'Service Worker',\n 'CacheStorage',\n 'File System',\n 'blob_storage',\n 'IndexedDB',\n 'DawnCache',\n 'GrShaderCache',\n 'ShaderCache',\n 'optimization_guide_model_store',\n 'BrowserMetrics',\n 'Crashpad',\n 'component_crx_cache',\n]);\n\nfunction findChrome(): string | null {\n for (const p of CHROME_PATHS) {\n if (p && existsSync(p)) return p;\n }\n return null;\n}\n\n/** Find the user's real Chrome profile directory */\nfunction findUserDataDir(): string | null {\n const candidates = [\n // Windows\n join(process.env.LOCALAPPDATA ?? '', 'Google', 'Chrome', 'User Data'),\n // macOS\n join(homedir(), 'Library', 'Application Support', 'Google', 'Chrome'),\n // Linux\n join(homedir(), '.config', 'google-chrome'),\n join(homedir(), '.config', 'chromium'),\n ];\n for (const p of candidates) {\n if (p && existsSync(p)) return p;\n }\n return null;\n}\n\nfunction getCdpPort(cdpUrl: string): number {\n try {\n return parseInt(new URL(cdpUrl).port, 10) || 9222;\n } catch {\n return 9222;\n }\n}\n\n/** Check if any Chrome process is currently running */\nfunction isChromeRunning(): boolean {\n try {\n if (process.platform === 'win32') {\n const out = execSync('tasklist /FI \"IMAGENAME eq chrome.exe\" /NH', {\n encoding: 'utf-8',\n windowsHide: true,\n });\n return out.includes('chrome.exe');\n } else {\n execSync('pgrep -x \"chrome|chromium|google-chrome\"', { encoding: 'utf-8' });\n return true;\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Copy user's Chrome profile to our working directory, skipping large cache dirs.\n * This preserves cookies, login state, extensions, etc.\n */\nfunction syncProfile(sourceDir: string, targetDir: string): void {\n mkdirSync(targetDir, { recursive: true });\n\n // Copy top-level files (Local State, etc.)\n const entries = readdirSync(sourceDir, { withFileTypes: true });\n for (const entry of entries) {\n const src = join(sourceDir, entry.name);\n const dst = join(targetDir, entry.name);\n\n if (entry.isFile()) {\n try {\n cpSync(src, dst, { force: true });\n } catch {\n // Some files may be locked, skip them\n }\n } else if (entry.isDirectory()) {\n if (entry.name === 'Default' || entry.name.startsWith('Profile ')) {\n // Copy profile dirs, skipping caches\n syncProfileDir(src, dst);\n } else if (!SKIP_DIRS.has(entry.name)) {\n // Copy other small dirs\n try {\n cpSync(src, dst, { recursive: true, force: true });\n } catch {\n // Skip locked/inaccessible dirs\n }\n }\n }\n }\n}\n\nfunction syncProfileDir(sourceDir: string, targetDir: string): void {\n mkdirSync(targetDir, { recursive: true });\n\n let entries;\n try {\n entries = readdirSync(sourceDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (SKIP_DIRS.has(entry.name)) continue;\n\n const src = join(sourceDir, entry.name);\n const dst = join(targetDir, entry.name);\n\n try {\n if (entry.isFile()) {\n cpSync(src, dst, { force: true });\n } else if (entry.isDirectory()) {\n cpSync(src, dst, { recursive: true, force: true });\n }\n } catch {\n // Skip locked files\n }\n }\n}\n\n/**\n * Manages a Playwright CDP connection to the user's Chrome.\n * Auto-launches Chrome with --remote-debugging-port if not already running.\n * Syncs user's Chrome profile to preserve cookies/login state.\n */\nexport class BrowserClient {\n private browser: Browser | null = null;\n private context: BrowserContext | null = null;\n private _page: Page | null = null;\n private cdpUrl: string;\n private chromeProcess: ChildProcess | null = null;\n\n constructor(cdpUrl: string) {\n this.cdpUrl = cdpUrl;\n }\n\n async connect(): Promise<void> {\n if (this.browser) return;\n\n const { chromium } = await import('playwright');\n\n // Try connecting to existing Chrome with CDP\n try {\n this.browser = await chromium.connectOverCDP(this.cdpUrl);\n } catch {\n // CDP not available — need to (re)launch Chrome\n await this.launchChrome();\n this.browser = await chromium.connectOverCDP(this.cdpUrl);\n }\n\n const contexts = this.browser.contexts();\n this.context = contexts[0] ?? await this.browser.newContext();\n\n const pages = this.context.pages();\n this._page = pages[0] ?? await this.context.newPage();\n }\n\n private async launchChrome(): Promise<void> {\n const chromePath = findChrome();\n if (!chromePath) {\n throw new Error(\n 'Chrome not found. Please install Chrome or start it manually with: chrome --remote-debugging-port=9222',\n );\n }\n\n const port = getCdpPort(this.cdpUrl);\n\n // If Chrome is already running without CDP, kill it first\n if (isChromeRunning()) {\n console.error('[windows-use] Chrome is running without CDP. Restarting with --remote-debugging-port...');\n try {\n if (process.platform === 'win32') {\n execSync('taskkill /F /IM chrome.exe /T', { windowsHide: true, stdio: 'ignore' });\n } else {\n execSync('pkill -f chrome', { stdio: 'ignore' });\n }\n } catch {\n // May fail if already exited\n }\n await new Promise((r) => setTimeout(r, 1500));\n }\n\n // --user-data-dir is REQUIRED for --remote-debugging-port to work\n const targetDir = join(homedir(), '.windows-use', 'chrome-profile');\n\n // Sync user's profile to preserve cookies/login state\n const userDir = findUserDataDir();\n if (userDir) {\n console.error('[windows-use] Syncing Chrome profile (cookies, login state)...');\n syncProfile(userDir, targetDir);\n console.error('[windows-use] Profile synced.');\n } else {\n mkdirSync(targetDir, { recursive: true });\n }\n\n console.error(`[windows-use] Launching Chrome with --remote-debugging-port=${port}`);\n\n this.chromeProcess = spawn(\n chromePath,\n [\n `--remote-debugging-port=${port}`,\n `--user-data-dir=${targetDir}`,\n ],\n { detached: true, stdio: 'ignore' },\n );\n this.chromeProcess.unref();\n\n // Wait for CDP to be ready\n for (let i = 0; i < 30; i++) {\n try {\n const res = await fetch(`http://localhost:${port}/json/version`);\n if (res.ok) return;\n } catch {\n // Not ready yet\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n\n throw new Error('Chrome launched but CDP endpoint did not become available within 15s');\n }\n\n async getPage(): Promise<Page> {\n await this.connect();\n return this._page!;\n }\n\n /** Create a new tab and switch to it. */\n async newPage(): Promise<Page> {\n await this.connect();\n this._page = await this.context!.newPage();\n return this._page;\n }\n\n async close(): Promise<void> {\n if (this.browser) {\n await this.browser.close().catch(() => {});\n this.browser = null;\n this.context = null;\n this._page = null;\n }\n }\n\n get connected(): boolean {\n return this.browser !== null && this.browser.isConnected();\n }\n}\n","import type { z } from 'zod';\n\n/**\n * Simple zod-to-JSON-Schema converter for OpenAI tool definitions.\n * Handles the subset of zod types we use (object, string, number, enum, boolean, optional, default, describe).\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n return convertZodType(schema);\n}\n\nfunction convertZodType(schema: z.ZodType): Record<string, unknown> {\n const def = (schema as any)._def;\n const typeName: string = def?.typeName;\n\n switch (typeName) {\n case 'ZodObject': {\n const shape = (schema as z.ZodObject<any>).shape;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = convertZodType(value as z.ZodType);\n if (!isOptional(value as z.ZodType)) {\n required.push(key);\n }\n }\n\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n }\n\n case 'ZodString': {\n const result: Record<string, unknown> = { type: 'string' };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case 'ZodNumber': {\n const result: Record<string, unknown> = { type: 'number' };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case 'ZodBoolean': {\n const result: Record<string, unknown> = { type: 'boolean' };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case 'ZodEnum': {\n const result: Record<string, unknown> = {\n type: 'string',\n enum: def.values,\n };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case 'ZodArray': {\n const result: Record<string, unknown> = {\n type: 'array',\n items: convertZodType(def.type),\n };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case 'ZodOptional':\n return convertZodType(def.innerType);\n\n case 'ZodDefault':\n return convertZodType(def.innerType);\n\n case 'ZodEffects':\n return convertZodType(def.schema);\n\n case 'ZodUnknown':\n return {};\n\n default:\n return { type: 'string' };\n }\n}\n\nfunction isOptional(schema: z.ZodType): boolean {\n const def = (schema as any)._def;\n const typeName: string = def?.typeName;\n return typeName === 'ZodOptional' || typeName === 'ZodDefault';\n}\n","import type { ToolDefinition, ToolContext, ToolResult } from './types.js';\nimport { zodToJsonSchema } from './zod-to-json.js';\nimport type OpenAI from 'openai';\n\nexport class ToolRegistry {\n private tools = new Map<string, ToolDefinition>();\n\n register(tool: ToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n get(name: string): ToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n toOpenAIFormat(): OpenAI.Chat.Completions.ChatCompletionTool[] {\n return Array.from(this.tools.values()).map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: zodToJsonSchema(tool.parameters),\n },\n }));\n }\n\n async execute(\n name: string,\n args: unknown,\n context: ToolContext,\n ): Promise<ToolResult> {\n const tool = this.tools.get(name);\n if (!tool) {\n return { type: 'text', content: `Error: unknown tool \"${name}\"` };\n }\n\n const parsed = tool.parameters.safeParse(args);\n if (!parsed.success) {\n return {\n type: 'text',\n content: `Error: invalid arguments for \"${name}\": ${parsed.error.message}`,\n };\n }\n\n return tool.execute(parsed.data, context);\n }\n}\n","import sharp from 'sharp';\n\nexport interface GridOptions {\n /** Minor grid line spacing in pixels (default: 100) */\n gridSpacing?: number;\n /** Coordinate label spacing in pixels (default: 200) */\n labelSpacing?: number;\n}\n\n/**\n * Add a coordinate grid overlay to a JPEG image buffer.\n * Returns a new JPEG buffer with grid lines and coordinate labels.\n */\nexport async function addCoordinateGrid(\n imageBuffer: Buffer,\n width: number,\n height: number,\n options: GridOptions = {},\n): Promise<Buffer> {\n const gridSpacing = options.gridSpacing ?? 100;\n const labelSpacing = options.labelSpacing ?? 200;\n const majorSpacing = gridSpacing * 5; // 500px\n\n const svgParts: string[] = [];\n\n // --- Grid lines ---\n for (let x = gridSpacing; x < width; x += gridSpacing) {\n const isMajor = x % majorSpacing === 0;\n const opacity = isMajor ? 0.35 : 0.15;\n const sw = isMajor ? 1.5 : 0.5;\n svgParts.push(\n `<line x1=\"${x}\" y1=\"0\" x2=\"${x}\" y2=\"${height}\" stroke=\"rgba(255,50,50,${opacity})\" stroke-width=\"${sw}\"/>`,\n );\n }\n for (let y = gridSpacing; y < height; y += gridSpacing) {\n const isMajor = y % majorSpacing === 0;\n const opacity = isMajor ? 0.35 : 0.15;\n const sw = isMajor ? 1.5 : 0.5;\n svgParts.push(\n `<line x1=\"0\" y1=\"${y}\" x2=\"${width}\" y2=\"${y}\" stroke=\"rgba(255,50,50,${opacity})\" stroke-width=\"${sw}\"/>`,\n );\n }\n\n // --- Coordinate labels along top edge ---\n for (let x = labelSpacing; x < width; x += labelSpacing) {\n const text = String(x);\n const tw = text.length * 7.5 + 6;\n svgParts.push(\n `<rect x=\"${x - tw / 2}\" y=\"2\" width=\"${tw}\" height=\"16\" fill=\"rgba(0,0,0,0.65)\" rx=\"3\"/>`,\n `<text x=\"${x}\" y=\"14\" text-anchor=\"middle\" fill=\"#ff6666\" font-size=\"11\" font-family=\"Consolas,monospace\" font-weight=\"bold\">${text}</text>`,\n );\n }\n\n // --- Coordinate labels along left edge ---\n for (let y = labelSpacing; y < height; y += labelSpacing) {\n const text = String(y);\n const tw = text.length * 7.5 + 6;\n svgParts.push(\n `<rect x=\"2\" y=\"${y - 8}\" width=\"${tw}\" height=\"16\" fill=\"rgba(0,0,0,0.65)\" rx=\"3\"/>`,\n `<text x=\"5\" y=\"${y + 4}\" fill=\"#ff6666\" font-size=\"11\" font-family=\"Consolas,monospace\" font-weight=\"bold\">${text}</text>`,\n );\n }\n\n // --- Origin label ---\n svgParts.push(\n `<rect x=\"2\" y=\"2\" width=\"22\" height=\"16\" fill=\"rgba(0,0,0,0.65)\" rx=\"3\"/>`,\n `<text x=\"5\" y=\"14\" fill=\"#ff6666\" font-size=\"11\" font-family=\"Consolas,monospace\" font-weight=\"bold\">0,0</text>`,\n );\n\n // --- Dimension label at bottom-right ---\n const dimText = `${width}x${height}`;\n const dimTw = dimText.length * 7.5 + 6;\n svgParts.push(\n `<rect x=\"${width - dimTw - 2}\" y=\"${height - 18}\" width=\"${dimTw}\" height=\"16\" fill=\"rgba(0,0,0,0.65)\" rx=\"3\"/>`,\n `<text x=\"${width - dimTw / 2 - 2}\" y=\"${height - 6}\" text-anchor=\"middle\" fill=\"#ff6666\" font-size=\"11\" font-family=\"Consolas,monospace\" font-weight=\"bold\">${dimText}</text>`,\n );\n\n const svg = Buffer.from(\n `<svg width=\"${width}\" height=\"${height}\" xmlns=\"http://www.w3.org/2000/svg\">${svgParts.join('')}</svg>`,\n );\n\n return sharp(imageBuffer)\n .composite([{ input: svg, top: 0, left: 0 }])\n .jpeg({ quality: 70 })\n .toBuffer();\n}\n","import { z } from 'zod';\nimport sharp from 'sharp';\nimport type { ToolDefinition } from '../types.js';\nimport { addCoordinateGrid } from './grid-overlay.js';\n\nexport const screenshotTool: ToolDefinition = {\n name: 'screenshot',\n description:\n 'Capture the full screen with a coordinate grid overlay. The grid shows pixel coordinates that match mouse_click/mouse_move coordinates. Returns a screenshot ID.',\n parameters: z.object({}),\n async execute(_args, ctx) {\n const { Monitor } = await import('node-screenshots');\n\n const monitors = Monitor.all();\n const primary = monitors.find((m: any) => m.isPrimary()) ?? monitors[0];\n if (!primary) {\n return { type: 'text', content: 'Error: No monitor found' };\n }\n\n const image = primary.captureImageSync();\n const physW = image.width;\n const physH = image.height;\n const scaleFactor: number = (primary as any).scaleFactor ?? 1;\n\n // Logical dimensions (matching OS coordinate system used by nut-js)\n const logicalW = Math.round(physW / scaleFactor);\n const logicalH = Math.round(physH / scaleFactor);\n\n // Resize to logical resolution using raw RGBA pixels\n const raw = image.toRawSync();\n const resized = await sharp(raw, {\n raw: { width: physW, height: physH, channels: 4 },\n })\n .resize(logicalW, logicalH)\n .jpeg({ quality: 70 })\n .toBuffer();\n\n // Clean version → ScreenshotStore (for report to user/main model)\n const cleanBase64 = resized.toString('base64');\n const id = ctx.screenshots.save(cleanBase64, 'image/jpeg', 'desktop');\n\n // Grid version → LLM (for coordinate reference)\n const gridImage = await addCoordinateGrid(resized, logicalW, logicalH);\n const gridBase64 = gridImage.toString('base64');\n\n return {\n type: 'image',\n base64: gridBase64,\n mimeType: 'image/jpeg',\n screenshotId: id,\n };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nasync function getNutJs() {\n return import('@nut-tree-fork/nut-js');\n}\n\nexport const mouseClickTool: ToolDefinition = {\n name: 'mouse_click',\n description: 'Click the mouse at the given screen coordinates.',\n parameters: z.object({\n x: z.number().describe('X coordinate on screen'),\n y: z.number().describe('Y coordinate on screen'),\n button: z.enum(['left', 'right', 'middle']).default('left').describe('Mouse button'),\n }),\n async execute(args) {\n const nut = await getNutJs();\n const point = new nut.Point(args.x, args.y);\n await nut.mouse.move(nut.straightTo(point));\n\n const buttonMap = {\n left: nut.Button.LEFT,\n right: nut.Button.RIGHT,\n middle: nut.Button.MIDDLE,\n };\n await nut.mouse.click(buttonMap[args.button]);\n\n return { type: 'text', content: `Clicked ${args.button} at (${args.x}, ${args.y})` };\n },\n};\n\nexport const mouseMoveTool: ToolDefinition = {\n name: 'mouse_move',\n description: 'Move the mouse to the given screen coordinates without clicking.',\n parameters: z.object({\n x: z.number().describe('X coordinate on screen'),\n y: z.number().describe('Y coordinate on screen'),\n }),\n async execute(args) {\n const nut = await getNutJs();\n const point = new nut.Point(args.x, args.y);\n await nut.mouse.move(nut.straightTo(point));\n return { type: 'text', content: `Mouse moved to (${args.x}, ${args.y})` };\n },\n};\n\nexport const mouseScrollTool: ToolDefinition = {\n name: 'mouse_scroll',\n description: 'Scroll the mouse wheel.',\n parameters: z.object({\n direction: z.enum(['up', 'down']).describe('Scroll direction'),\n amount: z.number().positive().default(3).describe('Number of scroll steps'),\n }),\n async execute(args) {\n const nut = await getNutJs();\n for (let i = 0; i < args.amount; i++) {\n if (args.direction === 'down') {\n await nut.mouse.scrollDown(1);\n } else {\n await nut.mouse.scrollUp(1);\n }\n }\n return { type: 'text', content: `Scrolled ${args.direction} ${args.amount} steps` };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nasync function getNutJs() {\n return import('@nut-tree-fork/nut-js');\n}\n\nexport const keyboardTypeTool: ToolDefinition = {\n name: 'keyboard_type',\n description: 'Type text using the keyboard. The text is typed character by character.',\n parameters: z.object({\n text: z.string().describe('The text to type'),\n }),\n async execute(args) {\n const nut = await getNutJs();\n await nut.keyboard.type(args.text);\n return { type: 'text', content: `Typed: \"${args.text}\"` };\n },\n};\n\n/**\n * Map common key names to nut-js Key enum values.\n */\nfunction resolveKey(nut: any, keyName: string): number {\n const keyMap: Record<string, string> = {\n 'ctrl': 'LeftControl',\n 'control': 'LeftControl',\n 'shift': 'LeftShift',\n 'alt': 'LeftAlt',\n 'meta': 'LeftWin',\n 'win': 'LeftWin',\n 'windows': 'LeftWin',\n 'enter': 'Return',\n 'return': 'Return',\n 'tab': 'Tab',\n 'escape': 'Escape',\n 'esc': 'Escape',\n 'backspace': 'Backspace',\n 'delete': 'Delete',\n 'space': 'Space',\n 'up': 'Up',\n 'down': 'Down',\n 'left': 'Left',\n 'right': 'Right',\n 'home': 'Home',\n 'end': 'End',\n 'pageup': 'PageUp',\n 'pagedown': 'PageDown',\n 'f1': 'F1', 'f2': 'F2', 'f3': 'F3', 'f4': 'F4',\n 'f5': 'F5', 'f6': 'F6', 'f7': 'F7', 'f8': 'F8',\n 'f9': 'F9', 'f10': 'F10', 'f11': 'F11', 'f12': 'F12',\n };\n\n const normalized = keyName.toLowerCase().trim();\n const mapped = keyMap[normalized] ?? keyName;\n\n // Try to find in the Key enum\n const key = nut.Key[mapped];\n if (key !== undefined) return key;\n\n // Try uppercase single char (e.g., 'a' -> 'A')\n if (mapped.length === 1) {\n const upper = mapped.toUpperCase();\n const k = nut.Key[upper];\n if (k !== undefined) return k;\n }\n\n throw new Error(`Unknown key: \"${keyName}\"`);\n}\n\nexport const keyboardPressTool: ToolDefinition = {\n name: 'keyboard_press',\n description: 'Press a key combination. Examples: [\"Ctrl\", \"C\"] for copy, [\"Enter\"] for enter, [\"Alt\", \"F4\"] to close window.',\n parameters: z.object({\n keys: z.array(z.string()).min(1).describe('Array of key names to press simultaneously'),\n }),\n async execute(args) {\n const nut = await getNutJs();\n const resolved = args.keys.map((k: string) => resolveKey(nut, k));\n await nut.keyboard.pressKey(...resolved);\n await nut.keyboard.releaseKey(...resolved);\n return { type: 'text', content: `Pressed: ${args.keys.join('+')}` };\n },\n};\n","import { z } from 'zod';\nimport { exec } from 'child_process';\nimport type { ToolDefinition } from '../types.js';\n\nconst MAX_OUTPUT_LENGTH = 10_000;\n\nexport const runCommandTool: ToolDefinition = {\n name: 'run_command',\n description: 'Execute a shell command and return its output. Uses PowerShell on Windows.',\n parameters: z.object({\n command: z.string().describe('The command to execute'),\n timeout: z.number().positive().default(30_000).describe('Timeout in milliseconds'),\n }),\n async execute(args) {\n return new Promise((resolve) => {\n exec(\n args.command,\n {\n timeout: args.timeout,\n maxBuffer: 1024 * 1024,\n shell: 'powershell.exe',\n windowsHide: true,\n },\n (error, stdout, stderr) => {\n let output = '';\n if (stdout) output += stdout;\n if (stderr) output += `\\n[stderr] ${stderr}`;\n if (error && error.killed) output += '\\n[timeout] Command timed out';\n else if (error) output += `\\n[exit code ${error.code}]`;\n\n // Truncate to protect context\n if (output.length > MAX_OUTPUT_LENGTH) {\n output = output.slice(0, MAX_OUTPUT_LENGTH) + '\\n...(truncated)';\n }\n\n resolve({ type: 'text', content: output.trim() || '(no output)' });\n },\n );\n });\n },\n};\n","import { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport type { ToolDefinition } from '../types.js';\n\nconst MAX_FILE_SIZE = 100_000; // chars\n\nexport const fileReadTool: ToolDefinition = {\n name: 'file_read',\n description: 'Read the contents of a file at the given path.',\n parameters: z.object({\n path: z.string().describe('Absolute path to the file'),\n }),\n async execute(args) {\n try {\n const content = await readFile(args.path, 'utf-8');\n if (content.length > MAX_FILE_SIZE) {\n return {\n type: 'text',\n content: content.slice(0, MAX_FILE_SIZE) + '\\n...(truncated)',\n };\n }\n return { type: 'text', content };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { type: 'text', content: `Error reading file: ${msg}` };\n }\n },\n};\n","import { z } from 'zod';\nimport { writeFile, mkdir } from 'fs/promises';\nimport { dirname } from 'path';\nimport type { ToolDefinition } from '../types.js';\n\nexport const fileWriteTool: ToolDefinition = {\n name: 'file_write',\n description: 'Write content to a file at the given path. Creates parent directories if needed.',\n parameters: z.object({\n path: z.string().describe('Absolute path to the file'),\n content: z.string().describe('Content to write'),\n }),\n async execute(args) {\n try {\n await mkdir(dirname(args.path), { recursive: true });\n await writeFile(args.path, args.content, 'utf-8');\n return { type: 'text', content: `File written: ${args.path}` };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { type: 'text', content: `Error writing file: ${msg}` };\n }\n },\n};\n","import { z } from 'zod';\nimport { readFileSync, existsSync } from 'fs';\nimport { extname } from 'path';\nimport type { ToolDefinition } from '../types.js';\n\nconst IMAGE_EXTS = new Set(['.png', '.jpg', '.jpeg', '.bmp', '.webp']);\n\nexport const useLocalImageTool: ToolDefinition = {\n name: 'use_local_image',\n description: 'Load a local image file and get a screenshot ID for it. Use this to reference local images in your report via [Image:img_X].',\n parameters: z.object({\n path: z.string().describe('Absolute path to the image file'),\n label: z.string().default('local').describe('Label for the image (e.g. \"chart\", \"photo\")'),\n }),\n async execute(args, ctx) {\n if (!existsSync(args.path)) {\n return { type: 'text', content: `Error: File not found: ${args.path}` };\n }\n\n const ext = extname(args.path).toLowerCase();\n if (!IMAGE_EXTS.has(ext)) {\n return { type: 'text', content: `Error: Not a supported image format (${ext}). Supported: ${[...IMAGE_EXTS].join(', ')}` };\n }\n\n const buf = readFileSync(args.path);\n const mimeType = (ext === '.png') ? 'image/png' as const : 'image/jpeg' as const;\n const base64 = buf.toString('base64');\n const id = ctx.screenshots.save(base64, mimeType, args.label);\n\n return {\n type: 'image',\n base64,\n mimeType,\n screenshotId: id,\n };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const browserNavigateTool: ToolDefinition = {\n name: 'browser_navigate',\n description: 'Navigate the browser to a URL.',\n parameters: z.object({\n url: z.string().describe('The URL to navigate to'),\n }),\n async execute(args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n await page.goto(args.url, { waitUntil: 'domcontentloaded', timeout: 30_000 });\n const title = await page.title();\n return { type: 'text', content: `Navigated to: ${args.url}\\nPage title: ${title}` };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const browserClickTool: ToolDefinition = {\n name: 'browser_click',\n description: 'Click an element on the web page using a CSS selector or text content.',\n parameters: z.object({\n selector: z.string().describe('CSS selector or text to find the element (e.g., \"button.submit\", \"text=Login\")'),\n }),\n async execute(args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n await page.click(args.selector, { timeout: 10_000 });\n return { type: 'text', content: `Clicked element: ${args.selector}` };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const browserTypeTool: ToolDefinition = {\n name: 'browser_type',\n description: 'Type text into an input field on the web page.',\n parameters: z.object({\n selector: z.string().describe('CSS selector for the input element'),\n text: z.string().describe('Text to type'),\n clear: z.boolean().default(true).describe('Whether to clear the field before typing'),\n }),\n async execute(args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n if (args.clear) {\n await page.fill(args.selector, args.text, { timeout: 10_000 });\n } else {\n await page.type(args.selector, args.text, { timeout: 10_000 });\n }\n return { type: 'text', content: `Typed \"${args.text}\" into ${args.selector}` };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const browserScreenshotTool: ToolDefinition = {\n name: 'browser_screenshot',\n description: 'Take a screenshot of the current browser page. Returns a screenshot ID (e.g. img_2) that you can reference later in report.',\n parameters: z.object({\n fullPage: z.boolean().default(false).describe('Whether to capture the full scrollable page'),\n }),\n async execute(args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n const buf = await page.screenshot({\n type: 'jpeg',\n quality: 70,\n fullPage: args.fullPage,\n scale: 'css',\n });\n const base64 = buf.toString('base64');\n const id = ctx.screenshots.save(base64, 'image/jpeg', 'browser');\n\n return {\n type: 'image',\n base64,\n mimeType: 'image/jpeg',\n screenshotId: id,\n };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nconst MAX_CONTENT_LENGTH = 20_000;\n\nexport const browserContentTool: ToolDefinition = {\n name: 'browser_content',\n description: 'Get the text content of the current web page. Returns visible text, not HTML.',\n parameters: z.object({}),\n async execute(_args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n const url = page.url();\n const title = await page.title();\n let text = await page.innerText('body').catch(() => '');\n\n if (text.length > MAX_CONTENT_LENGTH) {\n text = text.slice(0, MAX_CONTENT_LENGTH) + '\\n...(truncated)';\n }\n\n return {\n type: 'text',\n content: `URL: ${url}\\nTitle: ${title}\\n\\n${text}`,\n };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const browserScrollTool: ToolDefinition = {\n name: 'browser_scroll',\n description: 'Scroll the current web page.',\n parameters: z.object({\n direction: z.enum(['up', 'down']).describe('Scroll direction'),\n amount: z.number().positive().default(500).describe('Pixels to scroll'),\n }),\n async execute(args, ctx) {\n const browser = await ctx.getBrowser();\n const page = await browser.getPage();\n const delta = args.direction === 'down' ? args.amount : -args.amount;\n await page.evaluate((d: number) => window.scrollBy(0, d), delta);\n return { type: 'text', content: `Scrolled ${args.direction} ${args.amount}px` };\n },\n};\n","import { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const reportTool: ToolDefinition = {\n name: 'report',\n description:\n 'Report progress back to the caller. Call this when the task is completed, when you are blocked, or when you need guidance. Calling this STOPS your execution immediately.\\n\\nThe content field supports rich document format: mix text with screenshots using [Image:img_1] markers. Example:\\n\"Here is the current state:\\n[Image:img_2]\\nThe page shows...\"',\n parameters: z.object({\n status: z\n .enum(['completed', 'blocked', 'need_guidance'])\n .describe(\n '\"completed\" = task done, \"blocked\" = cannot proceed, \"need_guidance\" = need a decision',\n ),\n content: z\n .string()\n .describe('Rich report content. Use [Image:img_X] to embed screenshots captured earlier. Example: \"Task done.\\\\n[Image:img_1]\\\\nThe page shows the result.\"'),\n data: z.unknown().optional().describe('Optional structured data to return'),\n }),\n async execute(args) {\n return {\n type: 'report',\n status: args.status,\n content: args.content,\n data: args.data,\n };\n },\n};\n","import { ToolRegistry } from './registry.js';\nimport { screenshotTool } from './windows/screenshot.js';\nimport { mouseClickTool, mouseMoveTool, mouseScrollTool } from './windows/mouse.js';\nimport { keyboardTypeTool, keyboardPressTool } from './windows/keyboard.js';\nimport { runCommandTool } from './windows/command.js';\nimport { fileReadTool } from './file/read.js';\nimport { fileWriteTool } from './file/write.js';\nimport { useLocalImageTool } from './file/image.js';\nimport { browserNavigateTool } from './browser/navigate.js';\nimport { browserClickTool } from './browser/click.js';\nimport { browserTypeTool } from './browser/type.js';\nimport { browserScreenshotTool } from './browser/screenshot.js';\nimport { browserContentTool } from './browser/content.js';\nimport { browserScrollTool } from './browser/scroll.js';\nimport { reportTool } from './control/report.js';\n\nexport function createToolRegistry(): ToolRegistry {\n const registry = new ToolRegistry();\n\n // Windows tools\n registry.register(screenshotTool);\n registry.register(mouseClickTool);\n registry.register(mouseMoveTool);\n registry.register(mouseScrollTool);\n registry.register(keyboardTypeTool);\n registry.register(keyboardPressTool);\n registry.register(runCommandTool);\n\n // File tools\n registry.register(fileReadTool);\n registry.register(fileWriteTool);\n registry.register(useLocalImageTool);\n\n // Browser tools\n registry.register(browserNavigateTool);\n registry.register(browserClickTool);\n registry.register(browserTypeTool);\n registry.register(browserScreenshotTool);\n registry.register(browserContentTool);\n registry.register(browserScrollTool);\n\n // Control tools\n registry.register(reportTool);\n\n return registry;\n}\n","import type { z } from 'zod';\n\nexport interface StoredScreenshot {\n id: string;\n base64: string;\n mimeType: 'image/png' | 'image/jpeg';\n label: string; // e.g. \"desktop\", \"browser\"\n}\n\n/**\n * Simple in-memory screenshot store.\n * Screenshot tools save images here with auto-incrementing IDs.\n * Report content references them via [Image:img_1] markers.\n */\nexport class ScreenshotStore {\n private counter = 0;\n private store = new Map<string, StoredScreenshot>();\n\n save(base64: string, mimeType: 'image/png' | 'image/jpeg', label: string): string {\n this.counter++;\n const id = `img_${this.counter}`;\n this.store.set(id, { id, base64, mimeType, label });\n return id;\n }\n\n get(id: string): StoredScreenshot | undefined {\n return this.store.get(id);\n }\n\n listIds(): string[] {\n return [...this.store.keys()];\n }\n}\n\n/** A block in parsed report content */\nexport type ContentBlock =\n | { type: 'text'; text: string }\n | { type: 'image'; id: string; base64: string; mimeType: 'image/png' | 'image/jpeg'; label: string };\n\n/**\n * Parse report content string, expanding [Image:img_X] markers into image blocks.\n * Returns an array of text and image content blocks.\n */\nexport function parseReportContent(content: string, store: ScreenshotStore): ContentBlock[] {\n const blocks: ContentBlock[] = [];\n const regex = /\\[Image:(img_\\d+)\\]/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(content)) !== null) {\n // Text before the marker\n if (match.index > lastIndex) {\n blocks.push({ type: 'text', text: content.slice(lastIndex, match.index) });\n }\n\n const id = match[1];\n const screenshot = store.get(id);\n if (screenshot) {\n blocks.push({\n type: 'image',\n id: screenshot.id,\n base64: screenshot.base64,\n mimeType: screenshot.mimeType,\n label: screenshot.label,\n });\n } else {\n // Unknown ID — keep as text\n blocks.push({ type: 'text', text: match[0] });\n }\n\n lastIndex = regex.lastIndex;\n }\n\n // Remaining text after last marker\n if (lastIndex < content.length) {\n blocks.push({ type: 'text', text: content.slice(lastIndex) });\n }\n\n return blocks;\n}\n\n/** Strip [Image:...] markers, returning text-only content */\nexport function stripImageMarkers(content: string): string {\n return content.replace(/\\[Image:img_\\d+\\]/g, '').replace(/\\n{3,}/g, '\\n\\n').trim();\n}\n\nexport interface ToolContext {\n sessionId: string;\n cdpUrl: string;\n /** Lazy browser client getter — only connects on first call */\n getBrowser: () => Promise<import('./browser/client.js').BrowserClient>;\n /** Screenshot store — tools save screenshots here, report references by [Image:id] */\n screenshots: ScreenshotStore;\n}\n\nexport type ToolResult =\n | { type: 'text'; content: string }\n | { type: 'image'; base64: string; mimeType: 'image/png' | 'image/jpeg'; screenshotId: string }\n | {\n type: 'report';\n status: 'completed' | 'blocked' | 'need_guidance';\n content: string; // Rich content with [Image:img_1] markers\n data?: unknown;\n };\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n parameters: z.ZodType;\n execute(args: any, context: ToolContext): Promise<ToolResult>;\n}\n","import crypto from 'crypto';\nimport type { Config } from '../config/schema.js';\nimport { ContextManager } from '../agent/context-manager.js';\nimport { LLMClient } from '../agent/llm-client.js';\nimport { AgentRunner } from '../agent/runner.js';\nimport { BrowserClient } from '../tools/browser/client.js';\nimport { createToolRegistry } from '../tools/index.js';\nimport { ScreenshotStore, type ToolContext } from '../tools/types.js';\n\nexport interface Session {\n id: string;\n createdAt: Date;\n lastActivityAt: Date;\n config: Config;\n runner: AgentRunner;\n browserClient: BrowserClient;\n screenshots: ScreenshotStore;\n timeoutHandle: ReturnType<typeof setTimeout>;\n}\n\nexport class SessionRegistry {\n private sessions = new Map<string, Session>();\n\n create(config: Config): Session {\n const id = crypto.randomUUID();\n const contextManager = new ContextManager();\n const llmClient = new LLMClient(config);\n const browserClient = new BrowserClient(config.cdpUrl);\n const toolRegistry = createToolRegistry();\n const screenshotStore = new ScreenshotStore();\n\n const toolContext: ToolContext = {\n sessionId: id,\n cdpUrl: config.cdpUrl,\n getBrowser: () => {\n // Lazy connection\n return browserClient.connect().then(() => browserClient);\n },\n screenshots: screenshotStore,\n };\n\n const runner = new AgentRunner(\n llmClient,\n contextManager,\n toolRegistry,\n config,\n toolContext,\n );\n\n const timeoutHandle = setTimeout(\n () => this.destroy(id),\n config.timeoutMs,\n );\n\n const session: Session = {\n id,\n createdAt: new Date(),\n lastActivityAt: new Date(),\n config,\n runner,\n browserClient,\n screenshots: screenshotStore,\n timeoutHandle,\n };\n\n this.sessions.set(id, session);\n return session;\n }\n\n get(id: string): Session | undefined {\n return this.sessions.get(id);\n }\n\n touch(id: string): void {\n const session = this.sessions.get(id);\n if (!session) return;\n session.lastActivityAt = new Date();\n clearTimeout(session.timeoutHandle);\n session.timeoutHandle = setTimeout(\n () => this.destroy(id),\n session.config.timeoutMs,\n );\n }\n\n async destroy(id: string): Promise<void> {\n const session = this.sessions.get(id);\n if (!session) return;\n clearTimeout(session.timeoutHandle);\n await session.browserClient.close().catch(() => {});\n this.sessions.delete(id);\n }\n\n async destroyAll(): Promise<void> {\n await Promise.allSettled(\n [...this.sessions.keys()].map((id) => this.destroy(id)),\n );\n }\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { SessionRegistry } from './session-registry.js';\nimport { loadConfig } from '../config/loader.js';\nimport { parseReportContent } from '../tools/types.js';\n\nexport function registerMcpTools(\n server: McpServer,\n registry: SessionRegistry,\n): void {\n // Tool 1: create_session\n server.tool(\n 'create_session',\n 'Create a new automation session with a small LLM agent. Returns a session_id.',\n {\n api_key: z.string().optional().describe('LLM API key (or set WINDOWS_USE_API_KEY env)'),\n base_url: z.string().optional().describe('OpenAI-compatible base URL (or set WINDOWS_USE_BASE_URL env)'),\n model: z.string().optional().describe('Model name (or set WINDOWS_USE_MODEL env)'),\n cdp_url: z.string().optional().describe('Chrome CDP URL (default: http://localhost:9222)'),\n timeout_ms: z.number().optional().describe('Session inactivity timeout in ms (default: 300000)'),\n max_steps: z.number().optional().describe('Max tool-calling steps per instruction (default: 50)'),\n max_rounds: z.number().optional().describe('Max instruction rounds per session (default: 20)'),\n },\n async (args) => {\n const config = loadConfig({\n apiKey: args.api_key,\n baseURL: args.base_url,\n model: args.model,\n cdpUrl: args.cdp_url,\n timeoutMs: args.timeout_ms,\n maxSteps: args.max_steps,\n maxRounds: args.max_rounds,\n });\n\n const session = registry.create(config);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ session_id: session.id }),\n },\n ],\n };\n },\n );\n\n // Tool 2: send_instruction\n server.tool(\n 'send_instruction',\n 'Send a task instruction to the agent in a session. The agent executes it and returns a rich report with text and images.',\n {\n session_id: z.string().describe('Session ID from create_session'),\n instruction: z.string().describe('What you want the agent to do, in natural language'),\n },\n async (args) => {\n const session = registry.get(args.session_id);\n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: `Session \"${args.session_id}\" not found or expired`,\n }),\n },\n ],\n isError: true,\n };\n }\n\n registry.touch(args.session_id);\n\n const result = await session.runner.run(args.instruction);\n\n registry.touch(args.session_id);\n\n // Build multimodal MCP response by expanding [Image:id] markers\n const mcpContent: Array<{ type: string; text?: string; data?: string; mimeType?: string }> = [];\n\n // Metadata header\n mcpContent.push({\n type: 'text',\n text: JSON.stringify({\n status: result.status,\n steps_used: result.stepsUsed,\n round: session.runner.currentRound,\n rounds_remaining: session.config.maxRounds - session.runner.currentRound,\n ...(result.data !== undefined ? { data: result.data } : {}),\n }),\n });\n\n // Expand report content: [Image:img_X] markers → actual image blocks\n const blocks = parseReportContent(result.content, session.screenshots);\n for (const block of blocks) {\n if (block.type === 'text') {\n mcpContent.push({ type: 'text', text: block.text });\n } else {\n mcpContent.push({\n type: 'image',\n data: block.base64,\n mimeType: block.mimeType,\n });\n }\n }\n\n return { content: mcpContent as any };\n },\n );\n\n // Tool 3: done_session\n server.tool(\n 'done_session',\n 'Terminate a session and free all resources.',\n {\n session_id: z.string().describe('Session ID to terminate'),\n },\n async (args) => {\n await registry.destroy(args.session_id);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ success: true }),\n },\n ],\n };\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { SessionRegistry } from './session-registry.js';\nimport { registerMcpTools } from './tools.js';\n\nconst server = new McpServer({\n name: 'windows-use',\n version: '0.1.0',\n});\n\nconst registry = new SessionRegistry();\n\nregisterMcpTools(server, registry);\n\n// Graceful shutdown\nasync function shutdown() {\n await registry.destroyAll();\n process.exit(0);\n}\n\nprocess.on('SIGINT', shutdown);\nprocess.on('SIGTERM', shutdown);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n\n// Use stderr for logging — stdout is reserved for JSON-RPC\nconsole.error('[windows-use] MCP server started');\n","#!/usr/bin/env node\n\nimport { program } from 'commander';\nimport { createInterface } from 'readline';\nimport { createServer } from 'http';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\nimport { loadConfig, getConfigPath } from './config/loader.js';\nimport { SessionRegistry } from './mcp/session-registry.js';\nimport type { RunResult, StepEvent } from './agent/runner.js';\nimport { parseReportContent } from './tools/types.js';\n\n/** Tiny static file server for screenshots (node:http, zero deps) */\nfunction startScreenshotServer(screenshotDir: string): Promise<{ port: number; save: (base64: string) => string }> {\n let counter = 0;\n const files = new Map<string, Buffer>();\n\n return new Promise((resolve) => {\n const server = createServer((req, res) => {\n const name = req.url?.slice(1) ?? '';\n const buf = files.get(name);\n if (buf) {\n const ct = name.endsWith('.jpg') ? 'image/jpeg' : 'image/png';\n res.writeHead(200, { 'Content-Type': ct });\n res.end(buf);\n } else {\n // Index page — list all screenshots\n res.writeHead(200, { 'Content-Type': 'text/html' });\n const links = [...files.keys()]\n .map((f) => `<a href=\"/${f}\"><img src=\"/${f}\" style=\"max-width:400px;margin:8px\"></a>`)\n .join('\\n');\n res.end(`<html><body style=\"background:#1a1a1a;display:flex;flex-wrap:wrap\">${links}</body></html>`);\n }\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address();\n const port = typeof addr === 'object' && addr ? addr.port : 0;\n\n const save = (base64: string): string => {\n counter++;\n const name = `screenshot-${counter}.jpg`;\n const buf = Buffer.from(base64, 'base64');\n files.set(name, buf);\n // Also save to disk\n const filePath = join(screenshotDir, name);\n writeFileSync(filePath, buf);\n return `http://127.0.0.1:${port}/${name}`;\n };\n\n resolve({ port, save });\n });\n });\n}\n\nprogram\n .name('windows-use')\n .description('Run Windows/browser automation tasks using a small LLM agent')\n .version('0.2.0');\n\n// init command\nprogram\n .command('init')\n .description('Interactive setup, or import/export config via base64')\n .argument('[base64]', 'Import config from a base64 string')\n .option('--export', 'Export current config as a base64 string')\n .action(async (base64Input: string | undefined, opts: { export?: boolean }) => {\n const configPath = getConfigPath();\n\n // Export mode\n if (opts.export) {\n if (!existsSync(configPath)) {\n console.error('No config found. Run `windows-use init` first.');\n process.exit(1);\n }\n const raw = readFileSync(configPath, 'utf-8');\n const encoded = Buffer.from(raw).toString('base64');\n console.log(encoded);\n return;\n }\n\n // Import mode\n if (base64Input) {\n try {\n const decoded = Buffer.from(base64Input, 'base64').toString('utf-8');\n const parsed = JSON.parse(decoded);\n writeFileSync(configPath, JSON.stringify(parsed, null, 2) + '\\n', 'utf-8');\n console.log(`✅ Config imported to ${configPath}`);\n // Show what was imported (mask API key)\n const display = { ...parsed };\n if (display.apiKey) {\n display.apiKey = display.apiKey.slice(0, 6) + '...' + display.apiKey.slice(-4);\n }\n console.log(JSON.stringify(display, null, 2));\n } catch {\n console.error('Invalid base64 or JSON. Make sure you copied the full string.');\n process.exit(1);\n }\n return;\n }\n\n // Interactive mode (default)\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const ask = (q: string): Promise<string> =>\n new Promise((resolve) => rl.question(q, (a) => resolve(a.trim())));\n\n console.log('\\n🔧 windows-use setup\\n');\n\n const baseURL = await ask('Base URL (OpenAI-compatible endpoint): ');\n const apiKey = await ask('API Key: ');\n const model = await ask('Model name (e.g. qwen3.5-flash): ');\n\n rl.close();\n\n const config: Record<string, string> = {};\n if (baseURL) config.baseURL = baseURL;\n if (apiKey) config.apiKey = apiKey;\n if (model) config.model = model;\n\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n console.log(`\\n✅ Config saved to ${configPath}`);\n console.log('You can now run: windows-use \"your task here\"\\n');\n });\n\n// default command — run a task\nprogram\n .argument('[instruction]', 'The task to perform')\n .option('--api-key <key>', 'LLM API key')\n .option('--base-url <url>', 'OpenAI-compatible base URL')\n .option('--model <name>', 'Model name')\n .option('--cdp-url <url>', 'Chrome CDP URL (default: http://localhost:9222)')\n .option('--max-steps <n>', 'Max tool-calling steps per instruction', parseInt)\n .option('--max-rounds <n>', 'Max instruction rounds per session', parseInt)\n .option('--mcp', 'Start as MCP server instead of running a task')\n .action(async (instruction: string | undefined, opts: any) => {\n if (opts.mcp) {\n await import('./mcp/server.js');\n return;\n }\n\n let config;\n try {\n config = loadConfig({\n apiKey: opts.apiKey,\n baseURL: opts.baseUrl,\n model: opts.model,\n cdpUrl: opts.cdpUrl,\n maxSteps: opts.maxSteps,\n maxRounds: opts.maxRounds,\n });\n } catch (err) {\n console.error(\n 'Configuration error. Run `windows-use init` to set up, or pass --api-key, --base-url, --model flags.',\n );\n console.error(err instanceof Error ? err.message : err);\n process.exit(1);\n }\n\n // Set up screenshot server\n const screenshotDir = join(tmpdir(), 'windows-use-screenshots');\n mkdirSync(screenshotDir, { recursive: true });\n const { port, save: saveScreenshot } = await startScreenshotServer(screenshotDir);\n\n const registry = new SessionRegistry();\n const session = registry.create(config);\n\n // Hook step-by-step progress display\n session.runner.setOnStep((event: StepEvent) => {\n const prefix = ` [step ${event.step}]`;\n switch (event.type) {\n case 'thinking':\n console.log(`${prefix} 💭 ${event.content}`);\n break;\n case 'tool_call': {\n const argsStr = typeof event.args === 'object'\n ? JSON.stringify(event.args, null, 0)\n : String(event.args);\n const preview = argsStr.length > 120 ? argsStr.slice(0, 120) + '...' : argsStr;\n console.log(`${prefix} 🔧 ${event.name}(${preview})`);\n break;\n }\n case 'tool_result':\n console.log(`${prefix} ✓ ${event.name} → ${event.result}`);\n break;\n case 'error':\n console.log(`${prefix} ✗ ${event.message}`);\n break;\n }\n });\n\n console.log(`\\n[windows-use] Session ${session.id} created`);\n console.log(`[windows-use] Model: ${config.model}`);\n console.log(`[windows-use] Screenshots: http://127.0.0.1:${port}`);\n console.log(`[windows-use] Type \"exit\" or Ctrl+C to quit.\\n`);\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const ask = (prompt: string): Promise<string> =>\n new Promise((resolve) => rl.question(prompt, (a) => resolve(a.trim())));\n\n let nextInstruction = instruction ?? '';\n\n const printResult = (result: RunResult) => {\n const statusIcon = result.status === 'completed' ? '✅' :\n result.status === 'blocked' ? '🚫' : '❓';\n console.log(`\\n${statusIcon} [${result.status}]`);\n\n // Expand [Image:img_X] markers → screenshot URLs\n const blocks = parseReportContent(result.content, session.screenshots);\n for (const block of blocks) {\n if (block.type === 'text') {\n process.stdout.write(block.text);\n } else {\n const url = saveScreenshot(block.base64);\n process.stdout.write(`\\n 📸 ${block.label}: ${url}\\n`);\n }\n }\n\n if (result.data) {\n console.log(`\\n Data: ${JSON.stringify(result.data)}`);\n }\n const roundInfo = `round ${session.runner.currentRound}/${config.maxRounds}`;\n console.log(`\\n (${result.stepsUsed} steps, ${roundInfo})\\n`);\n };\n\n try {\n while (true) {\n if (!nextInstruction) {\n nextInstruction = await ask('> ');\n } else {\n console.log(`> ${nextInstruction}`);\n }\n\n if (!nextInstruction || nextInstruction.toLowerCase() === 'exit') {\n break;\n }\n\n if (session.runner.roundsExhausted) {\n console.log(`[windows-use] Session reached max rounds (${config.maxRounds}). Type \"exit\" to quit.\\n`);\n nextInstruction = '';\n continue;\n }\n\n console.log('[windows-use] Running...\\n');\n const result = await session.runner.run(nextInstruction);\n printResult(result);\n\n nextInstruction = '';\n }\n } catch (err) {\n console.error('\\nFatal error:', err instanceof Error ? err.message : err);\n } finally {\n rl.close();\n await registry.destroyAll();\n console.log('[windows-use] Session ended.');\n process.exit(0);\n }\n });\n\nprogram.parse();\n"],"mappings":"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","names":["existsSync","join","homedir","z","sharp","z","z","getNutJs","z","z","z","z","readFileSync","existsSync","z","z","z","z","init_screenshot","z","z","z","registry","init_screenshot","z","server","registry","init_tools","init_tools","existsSync","mkdirSync","readFileSync","join","server","registry"]}
|