windows-use 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +152 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +1253 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +148 -0
- package/dist/index.js +921 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +1034 -0
- package/dist/mcp/server.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/server.ts","../../src/mcp/session-registry.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/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/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/mcp/tools.ts","../../src/config/schema.ts","../../src/config/loader.ts"],"sourcesContent":["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","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 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 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(config.contextWindowSize);\n const llmClient = new LLMClient(config);\n const browserClient = new BrowserClient(config.cdpUrl);\n const toolRegistry = createToolRegistry();\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 };\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 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 type OpenAI from 'openai';\n\ntype Message = OpenAI.Chat.Completions.ChatCompletionMessageParam;\n\n/**\n * Sliding window message history.\n * Always keeps: system prompt (index 0) + most recent N messages.\n */\nexport class ContextManager {\n private messages: Message[] = [];\n private readonly maxMessages: number;\n\n constructor(maxMessages: number) {\n this.maxMessages = maxMessages;\n }\n\n append(message: Message): void {\n this.messages.push(message);\n }\n\n /** Returns the system prompt + the most recent messages within the window. */\n getWindow(): Message[] {\n if (this.messages.length === 0) return [];\n\n const systemPrompt = this.messages[0]?.role === 'system' ? this.messages[0] : null;\n const nonSystem = systemPrompt ? this.messages.slice(1) : this.messages;\n\n // Keep the most recent messages within the window\n const windowSize = this.maxMessages - (systemPrompt ? 1 : 0);\n const windowed = nonSystem.length > windowSize\n ? nonSystem.slice(-windowSize)\n : nonSystem;\n\n return systemPrompt ? [systemPrompt, ...windowed] : windowed;\n }\n\n /** Total messages stored (before windowing). */\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. Include a concise summary and optionally a screenshot as evidence.\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 summary: string;\n screenshot?: string;\n data?: unknown;\n stepsUsed: number;\n}\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\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 async run(instruction: string): Promise<RunResult> {\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.getWindow();\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 return {\n status: 'blocked',\n summary: `LLM API error: ${msg}`,\n stepsUsed,\n };\n }\n\n const choice = response.choices[0];\n if (!choice) {\n return {\n status: 'blocked',\n summary: 'LLM returned empty response',\n stepsUsed,\n };\n }\n\n const message = choice.message;\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 summary: 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 let args: unknown;\n try {\n args = JSON.parse(toolCall.function.arguments);\n } catch {\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 let result: ToolResult;\n try {\n result = await this.toolRegistry.execute(\n toolCall.function.name,\n args,\n this.toolContext,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\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.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 summary: result.summary,\n screenshot: result.screenshot,\n data: result.data,\n stepsUsed,\n };\n }\n\n // Image results: send as multimodal content\n if (result.type === 'image') {\n this.contextManager.append({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: [\n { type: 'text', text: 'Screenshot captured.' },\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\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 summary: `Exceeded maximum steps limit (${this.config.maxSteps}). Task may be incomplete.`,\n stepsUsed,\n };\n }\n}\n","import type { Browser, BrowserContext, Page } from 'playwright';\n\n/**\n * Manages a Playwright CDP connection to the user's Chrome.\n * Lazy-initialized: only connects when first browser tool is called.\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\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 this.browser = await chromium.connectOverCDP(this.cdpUrl);\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 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 // Only disconnect — don't close the user's Chrome\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 { z } from 'zod';\nimport type { ToolDefinition } from '../types.js';\n\nexport const screenshotTool: ToolDefinition = {\n name: 'screenshot',\n description: 'Capture the full screen and return it as an image. Use this to see what is currently displayed.',\n parameters: z.object({}),\n async execute() {\n // Dynamic import to avoid crashes if native module not available\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 buf = image.toPngSync();\n\n return {\n type: 'image',\n base64: buf.toString('base64'),\n mimeType: 'image/png',\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 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.',\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: 'png',\n fullPage: args.fullPage,\n });\n return {\n type: 'image',\n base64: buf.toString('base64'),\n mimeType: 'image/png',\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 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 summary: z\n .string()\n .describe('Concise human-readable summary of what was accomplished or what the problem is'),\n include_screenshot: z\n .boolean()\n .default(false)\n .describe('Whether to capture and include a screenshot of the current state'),\n data: z.unknown().optional().describe('Optional structured data to return'),\n }),\n async execute(args) {\n let screenshot: string | undefined;\n\n if (args.include_screenshot) {\n try {\n const { Monitor } = await import('node-screenshots');\n const monitors = Monitor.all();\n const primary = monitors.find((m: any) => m.isPrimary()) ?? monitors[0];\n if (primary) {\n const image = primary.captureImageSync();\n const buf = image.toPngSync();\n screenshot = buf.toString('base64');\n }\n } catch {\n // Silently skip if screenshot fails\n }\n }\n\n return {\n type: 'report',\n status: args.status,\n summary: args.summary,\n screenshot,\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 { 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\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 { 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';\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 },\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 });\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 status report.',\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 const content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> = [\n {\n type: 'text',\n text: JSON.stringify({\n status: result.status,\n summary: result.summary,\n steps_used: result.stepsUsed,\n ...(result.data !== undefined ? { data: result.data } : {}),\n }),\n },\n ];\n\n if (result.screenshot) {\n content.push({\n type: 'image',\n data: result.screenshot,\n mimeType: 'image/png',\n });\n }\n\n return { content: content 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 { 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 contextWindowSize: 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 { ConfigSchema, type Config } from './schema.js';\n\nexport function loadConfig(overrides?: Partial<Config>): Config {\n const raw = {\n apiKey: overrides?.apiKey ?? process.env.WINDOWS_USE_API_KEY ?? '',\n baseURL: overrides?.baseURL ?? process.env.WINDOWS_USE_BASE_URL ?? '',\n model: overrides?.model ?? process.env.WINDOWS_USE_MODEL ?? '',\n maxSteps: overrides?.maxSteps ?? intEnv('WINDOWS_USE_MAX_STEPS') ?? 50,\n contextWindowSize: overrides?.contextWindowSize ?? intEnv('WINDOWS_USE_CONTEXT_WINDOW') ?? 20,\n cdpUrl: overrides?.cdpUrl ?? process.env.WINDOWS_USE_CDP_URL ?? 'http://localhost:9222',\n timeoutMs: overrides?.timeoutMs ?? intEnv('WINDOWS_USE_TIMEOUT_MS') ?? 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"],"mappings":"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","names":["z","z","getNutJs","z","z","z","z","z","z","z","z","z","z","registry","z","z","server","registry","z"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "windows-use",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Let big LLMs delegate Windows/browser automation to small LLMs via sessions",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"windows-use": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./mcp": {
|
|
15
|
+
"import": "./dist/mcp/server.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"dev": "tsup --watch",
|
|
27
|
+
"prepublishOnly": "npm run build"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20.0.0"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
34
|
+
"@nut-tree-fork/nut-js": "^4.2.6",
|
|
35
|
+
"commander": "^13.1.0",
|
|
36
|
+
"node-screenshots": "^0.2.8",
|
|
37
|
+
"openai": "^4.86.0",
|
|
38
|
+
"playwright": "^1.50.0",
|
|
39
|
+
"zod": "^3.24.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^22.0.0",
|
|
43
|
+
"tsup": "^8.4.0",
|
|
44
|
+
"typescript": "^5.7.0"
|
|
45
|
+
},
|
|
46
|
+
"keywords": [
|
|
47
|
+
"windows",
|
|
48
|
+
"automation",
|
|
49
|
+
"mcp",
|
|
50
|
+
"llm",
|
|
51
|
+
"agent",
|
|
52
|
+
"browser"
|
|
53
|
+
],
|
|
54
|
+
"license": "MIT"
|
|
55
|
+
}
|