illuma-agents 1.0.43 → 1.0.44

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.
@@ -120,159 +120,134 @@ function formatResultForLLM(result, action) {
120
120
  }
121
121
  return parts.join('\n');
122
122
  }
123
- /**
124
- * Create a tool result (either wait for callback or return marker)
125
- */
126
- async function createToolResult(action, args, config, waitForResult) {
127
- const toolCallId = config?.toolCall?.id || `desktop-${Date.now()}`;
128
- if (waitForResult) {
129
- // Server context: wait for actual result from Electron app
130
- try {
131
- const result = await waitForResult(action, args, toolCallId);
132
- return formatResultForLLM(result, action);
133
- }
134
- catch (error) {
135
- const errorMessage = error instanceof Error ? error.message : String(error);
136
- return `Desktop action "${action}" failed: ${errorMessage}`;
137
- }
138
- }
139
- // Non-server context: return marker for later processing
140
- const response = {
141
- requiresDesktopExecution: true,
142
- action,
143
- args,
144
- toolCallId,
145
- };
146
- return JSON.stringify(response);
147
- }
148
123
  /**
149
124
  * Create desktop automation tools for the agent
150
125
  * These tools allow AI to control the user's desktop when Ranger Desktop is running
151
126
  */
152
127
  function createDesktopTools(options = {}) {
153
128
  const { waitForResult } = options;
154
- return [
155
- // computer_screenshot
156
- tools.tool(async (_args, config) => {
157
- return createToolResult(EDesktopTools.SCREENSHOT, {}, config, waitForResult);
158
- }, {
159
- name: EDesktopTools.SCREENSHOT,
160
- description: 'Take a screenshot of the entire screen. Use this to see what is currently displayed on the desktop.',
161
- schema: ScreenshotSchema,
162
- }),
163
- // computer_click
164
- tools.tool(async (args, config) => {
165
- return createToolResult(EDesktopTools.CLICK, args, config, waitForResult);
166
- }, {
167
- name: EDesktopTools.CLICK,
168
- description: 'Click the mouse at the specified screen coordinates. Use screenshot first to identify the target location.',
169
- schema: ClickSchema,
170
- }),
171
- // computer_double_click
172
- tools.tool(async (args, config) => {
173
- return createToolResult(EDesktopTools.DOUBLE_CLICK, args, config, waitForResult);
174
- }, {
175
- name: EDesktopTools.DOUBLE_CLICK,
176
- description: 'Double-click the mouse at the specified screen coordinates.',
177
- schema: DoubleClickSchema,
178
- }),
179
- // computer_right_click
180
- tools.tool(async (args, config) => {
181
- return createToolResult(EDesktopTools.RIGHT_CLICK, args, config, waitForResult);
182
- }, {
183
- name: EDesktopTools.RIGHT_CLICK,
184
- description: 'Right-click the mouse at the specified screen coordinates to open context menus.',
185
- schema: RightClickSchema,
186
- }),
187
- // computer_type
188
- tools.tool(async (args, config) => {
189
- return createToolResult(EDesktopTools.TYPE, args, config, waitForResult);
190
- }, {
191
- name: EDesktopTools.TYPE,
192
- description: 'Type text using the keyboard. Make sure the target input field is focused first (use click).',
193
- schema: TypeSchema,
194
- }),
195
- // computer_key
196
- tools.tool(async (args, config) => {
197
- return createToolResult(EDesktopTools.KEY, args, config, waitForResult);
198
- }, {
199
- name: EDesktopTools.KEY,
200
- description: 'Press a single key on the keyboard (Enter, Tab, Escape, arrow keys, function keys, etc.).',
201
- schema: KeySchema,
202
- }),
203
- // computer_key_combo
204
- tools.tool(async (args, config) => {
205
- return createToolResult(EDesktopTools.KEY_COMBO, args, config, waitForResult);
206
- }, {
207
- name: EDesktopTools.KEY_COMBO,
208
- description: 'Press a key combination (e.g., Ctrl+C to copy, Ctrl+V to paste, Alt+Tab to switch windows).',
209
- schema: KeyComboSchema,
210
- }),
211
- // computer_scroll
212
- tools.tool(async (args, config) => {
213
- return createToolResult(EDesktopTools.SCROLL, args, config, waitForResult);
214
- }, {
215
- name: EDesktopTools.SCROLL,
216
- description: 'Scroll at the specified screen coordinates. Use negative deltaY to scroll up, positive to scroll down.',
217
- schema: ScrollSchema,
218
- }),
219
- // computer_drag
220
- tools.tool(async (args, config) => {
221
- return createToolResult(EDesktopTools.DRAG, args, config, waitForResult);
222
- }, {
223
- name: EDesktopTools.DRAG,
224
- description: 'Drag the mouse from one position to another (for moving windows, selecting text, etc.).',
225
- schema: DragSchema,
226
- }),
227
- // computer_get_active_window
228
- tools.tool(async (_args, config) => {
229
- return createToolResult(EDesktopTools.GET_ACTIVE_WINDOW, {}, config, waitForResult);
230
- }, {
231
- name: EDesktopTools.GET_ACTIVE_WINDOW,
232
- description: 'Get information about the currently active window (title, application name, position, size).',
233
- schema: GetActiveWindowSchema,
234
- }),
235
- // computer_get_mouse_position
236
- tools.tool(async (_args, config) => {
237
- return createToolResult(EDesktopTools.GET_MOUSE_POSITION, {}, config, waitForResult);
238
- }, {
239
- name: EDesktopTools.GET_MOUSE_POSITION,
240
- description: 'Get the current mouse cursor position on screen.',
241
- schema: GetMousePositionSchema,
242
- }),
243
- // clipboard_read
244
- tools.tool(async (_args, config) => {
245
- return createToolResult(EDesktopTools.CLIPBOARD_READ, {}, config, waitForResult);
246
- }, {
247
- name: EDesktopTools.CLIPBOARD_READ,
248
- description: 'Read the current contents of the system clipboard.',
249
- schema: ClipboardReadSchema,
250
- }),
251
- // clipboard_write
252
- tools.tool(async (args, config) => {
253
- return createToolResult(EDesktopTools.CLIPBOARD_WRITE, args, config, waitForResult);
254
- }, {
255
- name: EDesktopTools.CLIPBOARD_WRITE,
256
- description: 'Write text to the system clipboard.',
257
- schema: ClipboardWriteSchema,
258
- }),
259
- // clipboard_paste
260
- tools.tool(async (_args, config) => {
261
- return createToolResult(EDesktopTools.CLIPBOARD_PASTE, {}, config, waitForResult);
262
- }, {
263
- name: EDesktopTools.CLIPBOARD_PASTE,
264
- description: 'Paste the clipboard contents (equivalent to Ctrl+V). Use clipboard_write first to set the content.',
265
- schema: ClipboardPasteSchema,
266
- }),
267
- // computer_wait
268
- tools.tool(async (args, config) => {
269
- return createToolResult(EDesktopTools.WAIT, args, config, waitForResult);
270
- }, {
271
- name: EDesktopTools.WAIT,
272
- description: 'Wait for the specified number of milliseconds. Use this to wait for UI animations or loading.',
273
- schema: WaitSchema,
274
- }),
275
- ];
129
+ const tools$1 = [];
130
+ /**
131
+ * Helper to create tool function that optionally waits for results
132
+ * The toolCallId is extracted from the RunnableConfig passed by LangChain
133
+ */
134
+ const createToolFunction = (action) => {
135
+ return async (args, config) => {
136
+ const toolCallId = config?.toolCall?.id ??
137
+ `desktop_${Date.now()}_${Math.random().toString(36).slice(2)}`;
138
+ // Create marker for Electron app
139
+ const marker = {
140
+ requiresDesktopExecution: true,
141
+ action,
142
+ args,
143
+ toolCallId,
144
+ };
145
+ // If no callback, return marker immediately (Electron handles via SSE interception)
146
+ if (!waitForResult) {
147
+ return JSON.stringify(marker);
148
+ }
149
+ // With callback: wait for actual results from Electron app
150
+ try {
151
+ const result = await waitForResult(action, args, toolCallId);
152
+ return formatResultForLLM(result, action);
153
+ }
154
+ catch (error) {
155
+ const errorMessage = error instanceof Error ? error.message : String(error);
156
+ return `Desktop action "${action}" failed: ${errorMessage}`;
157
+ }
158
+ };
159
+ };
160
+ // computer_screenshot
161
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.SCREENSHOT), {
162
+ name: EDesktopTools.SCREENSHOT,
163
+ description: 'Take a screenshot of the entire screen. Use this to see what is currently displayed on the desktop.',
164
+ schema: ScreenshotSchema,
165
+ }));
166
+ // computer_click
167
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.CLICK), {
168
+ name: EDesktopTools.CLICK,
169
+ description: 'Click the mouse at the specified screen coordinates. Use screenshot first to identify the target location.',
170
+ schema: ClickSchema,
171
+ }));
172
+ // computer_double_click
173
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.DOUBLE_CLICK), {
174
+ name: EDesktopTools.DOUBLE_CLICK,
175
+ description: 'Double-click the mouse at the specified screen coordinates.',
176
+ schema: DoubleClickSchema,
177
+ }));
178
+ // computer_right_click
179
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.RIGHT_CLICK), {
180
+ name: EDesktopTools.RIGHT_CLICK,
181
+ description: 'Right-click the mouse at the specified screen coordinates to open context menus.',
182
+ schema: RightClickSchema,
183
+ }));
184
+ // computer_type
185
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.TYPE), {
186
+ name: EDesktopTools.TYPE,
187
+ description: 'Type text using the keyboard. Make sure the target input field is focused first (use click).',
188
+ schema: TypeSchema,
189
+ }));
190
+ // computer_key
191
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.KEY), {
192
+ name: EDesktopTools.KEY,
193
+ description: 'Press a single key on the keyboard (Enter, Tab, Escape, arrow keys, function keys, etc.).',
194
+ schema: KeySchema,
195
+ }));
196
+ // computer_key_combo
197
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.KEY_COMBO), {
198
+ name: EDesktopTools.KEY_COMBO,
199
+ description: 'Press a key combination (e.g., Ctrl+C to copy, Ctrl+V to paste, Alt+Tab to switch windows).',
200
+ schema: KeyComboSchema,
201
+ }));
202
+ // computer_scroll
203
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.SCROLL), {
204
+ name: EDesktopTools.SCROLL,
205
+ description: 'Scroll at the specified screen coordinates. Use negative deltaY to scroll up, positive to scroll down.',
206
+ schema: ScrollSchema,
207
+ }));
208
+ // computer_drag
209
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.DRAG), {
210
+ name: EDesktopTools.DRAG,
211
+ description: 'Drag the mouse from one position to another (for moving windows, selecting text, etc.).',
212
+ schema: DragSchema,
213
+ }));
214
+ // computer_get_active_window
215
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.GET_ACTIVE_WINDOW), {
216
+ name: EDesktopTools.GET_ACTIVE_WINDOW,
217
+ description: 'Get information about the currently active window (title, application name, position, size).',
218
+ schema: GetActiveWindowSchema,
219
+ }));
220
+ // computer_get_mouse_position
221
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.GET_MOUSE_POSITION), {
222
+ name: EDesktopTools.GET_MOUSE_POSITION,
223
+ description: 'Get the current mouse cursor position on screen.',
224
+ schema: GetMousePositionSchema,
225
+ }));
226
+ // clipboard_read
227
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.CLIPBOARD_READ), {
228
+ name: EDesktopTools.CLIPBOARD_READ,
229
+ description: 'Read the current contents of the system clipboard.',
230
+ schema: ClipboardReadSchema,
231
+ }));
232
+ // clipboard_write
233
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.CLIPBOARD_WRITE), {
234
+ name: EDesktopTools.CLIPBOARD_WRITE,
235
+ description: 'Write text to the system clipboard.',
236
+ schema: ClipboardWriteSchema,
237
+ }));
238
+ // clipboard_paste
239
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.CLIPBOARD_PASTE), {
240
+ name: EDesktopTools.CLIPBOARD_PASTE,
241
+ description: 'Paste the clipboard contents (equivalent to Ctrl+V). Use clipboard_write first to set the content.',
242
+ schema: ClipboardPasteSchema,
243
+ }));
244
+ // computer_wait
245
+ tools$1.push(tools.tool(createToolFunction(EDesktopTools.WAIT), {
246
+ name: EDesktopTools.WAIT,
247
+ description: 'Wait for the specified number of milliseconds. Use this to wait for UI animations or loading.',
248
+ schema: WaitSchema,
249
+ }));
250
+ return tools$1;
276
251
  }
277
252
  /**
278
253
  * Get all desktop tool names
@@ -1 +1 @@
1
- {"version":3,"file":"DesktopTools.cjs","sources":["../../../src/tools/DesktopTools.ts"],"sourcesContent":["import { z } from 'zod';\r\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\r\n\r\n/**\r\n * Type for tool configuration passed by LangChain runtime\r\n */\r\ntype ToolCallConfig = { toolCall?: { id?: string } };\r\n\r\n/**\r\n * Desktop tool names - keep in sync with Ranger Desktop Electron app\r\n * These tools execute locally in the Electron app, NOT on the server\r\n */\r\nexport const EDesktopTools = {\r\n SCREENSHOT: 'computer_screenshot',\r\n CLICK: 'computer_click',\r\n DOUBLE_CLICK: 'computer_double_click',\r\n RIGHT_CLICK: 'computer_right_click',\r\n TYPE: 'computer_type',\r\n KEY: 'computer_key',\r\n KEY_COMBO: 'computer_key_combo',\r\n SCROLL: 'computer_scroll',\r\n DRAG: 'computer_drag',\r\n GET_ACTIVE_WINDOW: 'computer_get_active_window',\r\n GET_MOUSE_POSITION: 'computer_get_mouse_position',\r\n CLIPBOARD_READ: 'clipboard_read',\r\n CLIPBOARD_WRITE: 'clipboard_write',\r\n CLIPBOARD_PASTE: 'clipboard_paste',\r\n WAIT: 'computer_wait',\r\n} as const;\r\n\r\nexport type DesktopToolName =\r\n (typeof EDesktopTools)[keyof typeof EDesktopTools];\r\n\r\n/**\r\n * Callback function type for waiting on desktop action results\r\n * This allows the server (Ranger) to provide a callback that waits for the Electron app\r\n * to POST results back to the server before returning to the LLM.\r\n *\r\n * @param action - The desktop action (click, type, screenshot, etc.)\r\n * @param args - Arguments for the action\r\n * @param toolCallId - Unique ID for this tool call (from config.toolCall.id)\r\n * @returns Promise that resolves with the actual desktop result\r\n */\r\nexport type DesktopToolCallback = (\r\n action: string,\r\n args: Record<string, unknown>,\r\n toolCallId: string\r\n) => Promise<DesktopActionResult>;\r\n\r\n/**\r\n * Result returned from desktop action execution\r\n */\r\nexport interface DesktopActionResult {\r\n success: boolean;\r\n error?: string;\r\n screenshot?: {\r\n base64: string;\r\n width: number;\r\n height: number;\r\n };\r\n activeWindow?: {\r\n title: string;\r\n app: string;\r\n bounds?: { x: number; y: number; width: number; height: number };\r\n };\r\n mousePosition?: { x: number; y: number };\r\n clipboard?: string;\r\n}\r\n\r\n/**\r\n * Check if desktop capability is available based on request headers or context\r\n * The Ranger Desktop Electron app sets these headers when connected:\r\n * - X-Ranger-Desktop: true\r\n * - X-Ranger-Desktop-Capable: true\r\n */\r\nexport function hasDesktopCapability(req?: {\r\n headers?: Record<string, string | string[] | undefined>;\r\n}): boolean {\r\n if (!req?.headers) {\r\n return false;\r\n }\r\n\r\n const desktopApp = req.headers['x-ranger-desktop'];\r\n const desktopCapable = req.headers['x-ranger-desktop-capable'];\r\n\r\n return desktopApp === 'true' || desktopCapable === 'true';\r\n}\r\n\r\n// Tool schemas\r\nconst ScreenshotSchema = z.object({});\r\n\r\nconst ClickSchema = z.object({\r\n x: z.number().describe('X coordinate to click'),\r\n y: z.number().describe('Y coordinate to click'),\r\n});\r\n\r\nconst DoubleClickSchema = z.object({\r\n x: z.number().describe('X coordinate to double-click'),\r\n y: z.number().describe('Y coordinate to double-click'),\r\n});\r\n\r\nconst RightClickSchema = z.object({\r\n x: z.number().describe('X coordinate to right-click'),\r\n y: z.number().describe('Y coordinate to right-click'),\r\n});\r\n\r\nconst TypeSchema = z.object({\r\n text: z.string().describe('Text to type'),\r\n});\r\n\r\nconst KeySchema = z.object({\r\n key: z\r\n .string()\r\n .describe(\r\n 'Key to press (e.g., \"Enter\", \"Tab\", \"Escape\", \"Backspace\", \"Delete\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\", \"F1\"-\"F12\")'\r\n ),\r\n});\r\n\r\nconst KeyComboSchema = z.object({\r\n keys: z\r\n .array(z.string())\r\n .describe(\r\n 'Array of keys to press together (e.g., [\"Control\", \"c\"] for copy, [\"Alt\", \"Tab\"] for window switch)'\r\n ),\r\n});\r\n\r\nconst ScrollSchema = z.object({\r\n x: z.number().describe('X coordinate to scroll at'),\r\n y: z.number().describe('Y coordinate to scroll at'),\r\n deltaX: z.number().optional().describe('Horizontal scroll amount (pixels)'),\r\n deltaY: z.number().describe('Vertical scroll amount (pixels, negative = up, positive = down)'),\r\n});\r\n\r\nconst DragSchema = z.object({\r\n startX: z.number().describe('Starting X coordinate'),\r\n startY: z.number().describe('Starting Y coordinate'),\r\n endX: z.number().describe('Ending X coordinate'),\r\n endY: z.number().describe('Ending Y coordinate'),\r\n});\r\n\r\nconst GetActiveWindowSchema = z.object({});\r\n\r\nconst GetMousePositionSchema = z.object({});\r\n\r\nconst ClipboardReadSchema = z.object({});\r\n\r\nconst ClipboardWriteSchema = z.object({\r\n text: z.string().describe('Text to write to clipboard'),\r\n});\r\n\r\nconst ClipboardPasteSchema = z.object({});\r\n\r\nconst WaitSchema = z.object({\r\n ms: z.number().describe('Milliseconds to wait'),\r\n});\r\n\r\n/**\r\n * Desktop tool response interface\r\n * This is what the Electron app returns after executing the action\r\n */\r\nexport interface DesktopToolResponse {\r\n requiresDesktopExecution: true;\r\n action: string;\r\n args: Record<string, unknown>;\r\n toolCallId?: string;\r\n}\r\n\r\n/**\r\n * Options for creating desktop tools\r\n */\r\nexport interface CreateDesktopToolsOptions {\r\n /**\r\n * Optional callback that waits for desktop action results.\r\n * When provided, tools will await this callback to get actual results from the Electron app.\r\n * When not provided, tools return markers immediately (for non-server contexts).\r\n */\r\n waitForResult?: DesktopToolCallback;\r\n}\r\n\r\n/**\r\n * Format desktop action result for LLM consumption\r\n */\r\nfunction formatResultForLLM(\r\n result: DesktopActionResult,\r\n action: string\r\n): string {\r\n if (!result.success && result.error) {\r\n return `Desktop action \"${action}\" failed: ${result.error}`;\r\n }\r\n\r\n const parts: string[] = [];\r\n\r\n if (result.screenshot) {\r\n parts.push(\r\n `Screenshot captured (${result.screenshot.width}x${result.screenshot.height})`\r\n );\r\n // The base64 image will be handled separately by the message formatter\r\n }\r\n\r\n if (result.activeWindow) {\r\n parts.push(`**Active Window:**`);\r\n parts.push(` - Title: ${result.activeWindow.title}`);\r\n parts.push(` - App: ${result.activeWindow.app}`);\r\n if (result.activeWindow.bounds) {\r\n const b = result.activeWindow.bounds;\r\n parts.push(` - Position: (${b.x}, ${b.y})`);\r\n parts.push(` - Size: ${b.width}x${b.height}`);\r\n }\r\n }\r\n\r\n if (result.mousePosition) {\r\n parts.push(\r\n `**Mouse Position:** (${result.mousePosition.x}, ${result.mousePosition.y})`\r\n );\r\n }\r\n\r\n if (result.clipboard !== undefined) {\r\n parts.push(`**Clipboard Content:** ${result.clipboard}`);\r\n }\r\n\r\n if (parts.length === 0) {\r\n parts.push(`Desktop action \"${action}\" completed successfully.`);\r\n }\r\n\r\n return parts.join('\\n');\r\n}\r\n\r\n/**\r\n * Create a tool result (either wait for callback or return marker)\r\n */\r\nasync function createToolResult(\r\n action: string,\r\n args: Record<string, unknown>,\r\n config: ToolCallConfig | undefined,\r\n waitForResult?: DesktopToolCallback\r\n): Promise<string> {\r\n const toolCallId = config?.toolCall?.id || `desktop-${Date.now()}`;\r\n\r\n if (waitForResult) {\r\n // Server context: wait for actual result from Electron app\r\n try {\r\n const result = await waitForResult(action, args, toolCallId);\r\n return formatResultForLLM(result, action);\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : String(error);\r\n return `Desktop action \"${action}\" failed: ${errorMessage}`;\r\n }\r\n }\r\n\r\n // Non-server context: return marker for later processing\r\n const response: DesktopToolResponse = {\r\n requiresDesktopExecution: true,\r\n action,\r\n args,\r\n toolCallId,\r\n };\r\n return JSON.stringify(response);\r\n}\r\n\r\n/**\r\n * Create desktop automation tools for the agent\r\n * These tools allow AI to control the user's desktop when Ranger Desktop is running\r\n */\r\nexport function createDesktopTools(\r\n options: CreateDesktopToolsOptions = {}\r\n): DynamicStructuredTool[] {\r\n const { waitForResult } = options;\r\n\r\n return [\r\n // computer_screenshot\r\n tool(\r\n async (_args, config) => {\r\n return createToolResult(\r\n EDesktopTools.SCREENSHOT,\r\n {},\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.SCREENSHOT,\r\n description:\r\n 'Take a screenshot of the entire screen. Use this to see what is currently displayed on the desktop.',\r\n schema: ScreenshotSchema,\r\n }\r\n ),\r\n\r\n // computer_click\r\n tool(\r\n async (args, config) => {\r\n return createToolResult(\r\n EDesktopTools.CLICK,\r\n args,\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.CLICK,\r\n description:\r\n 'Click the mouse at the specified screen coordinates. Use screenshot first to identify the target location.',\r\n schema: ClickSchema,\r\n }\r\n ),\r\n\r\n // computer_double_click\r\n tool(\r\n async (args, config) => {\r\n return createToolResult(\r\n EDesktopTools.DOUBLE_CLICK,\r\n args,\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.DOUBLE_CLICK,\r\n description:\r\n 'Double-click the mouse at the specified screen coordinates.',\r\n schema: DoubleClickSchema,\r\n }\r\n ),\r\n\r\n // computer_right_click\r\n tool(\r\n async (args, config) => {\r\n return createToolResult(\r\n EDesktopTools.RIGHT_CLICK,\r\n args,\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.RIGHT_CLICK,\r\n description:\r\n 'Right-click the mouse at the specified screen coordinates to open context menus.',\r\n schema: RightClickSchema,\r\n }\r\n ),\r\n\r\n // computer_type\r\n tool(\r\n async (args, config) => {\r\n return createToolResult(\r\n EDesktopTools.TYPE,\r\n args,\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.TYPE,\r\n description:\r\n 'Type text using the keyboard. Make sure the target input field is focused first (use click).',\r\n schema: TypeSchema,\r\n }\r\n ),\r\n\r\n // computer_key\r\n tool(\r\n async (args, config) => {\r\n return createToolResult(\r\n EDesktopTools.KEY,\r\n args,\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.KEY,\r\n description:\r\n 'Press a single key on the keyboard (Enter, Tab, Escape, arrow keys, function keys, etc.).',\r\n schema: KeySchema,\r\n }\r\n ),\r\n\r\n // computer_key_combo\r\n tool(\r\n async (args, config) => {\r\n return createToolResult(\r\n EDesktopTools.KEY_COMBO,\r\n args,\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.KEY_COMBO,\r\n description:\r\n 'Press a key combination (e.g., Ctrl+C to copy, Ctrl+V to paste, Alt+Tab to switch windows).',\r\n schema: KeyComboSchema,\r\n }\r\n ),\r\n\r\n // computer_scroll\r\n tool(\r\n async (args, config) => {\r\n return createToolResult(\r\n EDesktopTools.SCROLL,\r\n args,\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.SCROLL,\r\n description:\r\n 'Scroll at the specified screen coordinates. Use negative deltaY to scroll up, positive to scroll down.',\r\n schema: ScrollSchema,\r\n }\r\n ),\r\n\r\n // computer_drag\r\n tool(\r\n async (args, config) => {\r\n return createToolResult(\r\n EDesktopTools.DRAG,\r\n args,\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.DRAG,\r\n description:\r\n 'Drag the mouse from one position to another (for moving windows, selecting text, etc.).',\r\n schema: DragSchema,\r\n }\r\n ),\r\n\r\n // computer_get_active_window\r\n tool(\r\n async (_args, config) => {\r\n return createToolResult(\r\n EDesktopTools.GET_ACTIVE_WINDOW,\r\n {},\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.GET_ACTIVE_WINDOW,\r\n description:\r\n 'Get information about the currently active window (title, application name, position, size).',\r\n schema: GetActiveWindowSchema,\r\n }\r\n ),\r\n\r\n // computer_get_mouse_position\r\n tool(\r\n async (_args, config) => {\r\n return createToolResult(\r\n EDesktopTools.GET_MOUSE_POSITION,\r\n {},\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.GET_MOUSE_POSITION,\r\n description: 'Get the current mouse cursor position on screen.',\r\n schema: GetMousePositionSchema,\r\n }\r\n ),\r\n\r\n // clipboard_read\r\n tool(\r\n async (_args, config) => {\r\n return createToolResult(\r\n EDesktopTools.CLIPBOARD_READ,\r\n {},\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.CLIPBOARD_READ,\r\n description: 'Read the current contents of the system clipboard.',\r\n schema: ClipboardReadSchema,\r\n }\r\n ),\r\n\r\n // clipboard_write\r\n tool(\r\n async (args, config) => {\r\n return createToolResult(\r\n EDesktopTools.CLIPBOARD_WRITE,\r\n args,\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.CLIPBOARD_WRITE,\r\n description: 'Write text to the system clipboard.',\r\n schema: ClipboardWriteSchema,\r\n }\r\n ),\r\n\r\n // clipboard_paste\r\n tool(\r\n async (_args, config) => {\r\n return createToolResult(\r\n EDesktopTools.CLIPBOARD_PASTE,\r\n {},\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.CLIPBOARD_PASTE,\r\n description:\r\n 'Paste the clipboard contents (equivalent to Ctrl+V). Use clipboard_write first to set the content.',\r\n schema: ClipboardPasteSchema,\r\n }\r\n ),\r\n\r\n // computer_wait\r\n tool(\r\n async (args, config) => {\r\n return createToolResult(\r\n EDesktopTools.WAIT,\r\n args,\r\n config as ToolCallConfig,\r\n waitForResult\r\n );\r\n },\r\n {\r\n name: EDesktopTools.WAIT,\r\n description:\r\n 'Wait for the specified number of milliseconds. Use this to wait for UI animations or loading.',\r\n schema: WaitSchema,\r\n }\r\n ),\r\n ];\r\n}\r\n\r\n/**\r\n * Get all desktop tool names\r\n */\r\nexport function getDesktopToolNames(): DesktopToolName[] {\r\n return Object.values(EDesktopTools);\r\n}\r\n\r\n/**\r\n * Check if a tool name is a desktop tool\r\n */\r\nexport function isDesktopTool(name: string): name is DesktopToolName {\r\n return Object.values(EDesktopTools).includes(name as DesktopToolName);\r\n}\r\n"],"names":["z","tool"],"mappings":"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"}
1
+ {"version":3,"file":"DesktopTools.cjs","sources":["../../../src/tools/DesktopTools.ts"],"sourcesContent":["import { z } from 'zod';\r\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\r\n\r\n/**\r\n * Desktop tool names - keep in sync with Ranger Desktop Electron app\r\n * These tools execute locally in the Electron app, NOT on the server\r\n */\r\nexport const EDesktopTools = {\r\n SCREENSHOT: 'computer_screenshot',\r\n CLICK: 'computer_click',\r\n DOUBLE_CLICK: 'computer_double_click',\r\n RIGHT_CLICK: 'computer_right_click',\r\n TYPE: 'computer_type',\r\n KEY: 'computer_key',\r\n KEY_COMBO: 'computer_key_combo',\r\n SCROLL: 'computer_scroll',\r\n DRAG: 'computer_drag',\r\n GET_ACTIVE_WINDOW: 'computer_get_active_window',\r\n GET_MOUSE_POSITION: 'computer_get_mouse_position',\r\n CLIPBOARD_READ: 'clipboard_read',\r\n CLIPBOARD_WRITE: 'clipboard_write',\r\n CLIPBOARD_PASTE: 'clipboard_paste',\r\n WAIT: 'computer_wait',\r\n} as const;\r\n\r\nexport type DesktopToolName =\r\n (typeof EDesktopTools)[keyof typeof EDesktopTools];\r\n\r\n/**\r\n * Callback function type for waiting on desktop action results\r\n * This allows the server (Ranger) to provide a callback that waits for the Electron app\r\n * to POST results back to the server before returning to the LLM.\r\n *\r\n * @param action - The desktop action (click, type, screenshot, etc.)\r\n * @param args - Arguments for the action\r\n * @param toolCallId - Unique ID for this tool call (from config.toolCall.id)\r\n * @returns Promise that resolves with the actual desktop result\r\n */\r\nexport type DesktopToolCallback = (\r\n action: string,\r\n args: Record<string, unknown>,\r\n toolCallId: string\r\n) => Promise<DesktopActionResult>;\r\n\r\n/**\r\n * Result returned from desktop action execution\r\n */\r\nexport interface DesktopActionResult {\r\n success: boolean;\r\n error?: string;\r\n screenshot?: {\r\n base64: string;\r\n width: number;\r\n height: number;\r\n };\r\n activeWindow?: {\r\n title: string;\r\n app: string;\r\n bounds?: { x: number; y: number; width: number; height: number };\r\n };\r\n mousePosition?: { x: number; y: number };\r\n clipboard?: string;\r\n}\r\n\r\n/**\r\n * Check if desktop capability is available based on request headers or context\r\n * The Ranger Desktop Electron app sets these headers when connected:\r\n * - X-Ranger-Desktop: true\r\n * - X-Ranger-Desktop-Capable: true\r\n */\r\nexport function hasDesktopCapability(req?: {\r\n headers?: Record<string, string | string[] | undefined>;\r\n}): boolean {\r\n if (!req?.headers) {\r\n return false;\r\n }\r\n\r\n const desktopApp = req.headers['x-ranger-desktop'];\r\n const desktopCapable = req.headers['x-ranger-desktop-capable'];\r\n\r\n return desktopApp === 'true' || desktopCapable === 'true';\r\n}\r\n\r\n// Tool schemas\r\nconst ScreenshotSchema = z.object({});\r\n\r\nconst ClickSchema = z.object({\r\n x: z.number().describe('X coordinate to click'),\r\n y: z.number().describe('Y coordinate to click'),\r\n});\r\n\r\nconst DoubleClickSchema = z.object({\r\n x: z.number().describe('X coordinate to double-click'),\r\n y: z.number().describe('Y coordinate to double-click'),\r\n});\r\n\r\nconst RightClickSchema = z.object({\r\n x: z.number().describe('X coordinate to right-click'),\r\n y: z.number().describe('Y coordinate to right-click'),\r\n});\r\n\r\nconst TypeSchema = z.object({\r\n text: z.string().describe('Text to type'),\r\n});\r\n\r\nconst KeySchema = z.object({\r\n key: z\r\n .string()\r\n .describe(\r\n 'Key to press (e.g., \"Enter\", \"Tab\", \"Escape\", \"Backspace\", \"Delete\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\", \"F1\"-\"F12\")'\r\n ),\r\n});\r\n\r\nconst KeyComboSchema = z.object({\r\n keys: z\r\n .array(z.string())\r\n .describe(\r\n 'Array of keys to press together (e.g., [\"Control\", \"c\"] for copy, [\"Alt\", \"Tab\"] for window switch)'\r\n ),\r\n});\r\n\r\nconst ScrollSchema = z.object({\r\n x: z.number().describe('X coordinate to scroll at'),\r\n y: z.number().describe('Y coordinate to scroll at'),\r\n deltaX: z.number().optional().describe('Horizontal scroll amount (pixels)'),\r\n deltaY: z.number().describe('Vertical scroll amount (pixels, negative = up, positive = down)'),\r\n});\r\n\r\nconst DragSchema = z.object({\r\n startX: z.number().describe('Starting X coordinate'),\r\n startY: z.number().describe('Starting Y coordinate'),\r\n endX: z.number().describe('Ending X coordinate'),\r\n endY: z.number().describe('Ending Y coordinate'),\r\n});\r\n\r\nconst GetActiveWindowSchema = z.object({});\r\n\r\nconst GetMousePositionSchema = z.object({});\r\n\r\nconst ClipboardReadSchema = z.object({});\r\n\r\nconst ClipboardWriteSchema = z.object({\r\n text: z.string().describe('Text to write to clipboard'),\r\n});\r\n\r\nconst ClipboardPasteSchema = z.object({});\r\n\r\nconst WaitSchema = z.object({\r\n ms: z.number().describe('Milliseconds to wait'),\r\n});\r\n\r\n/**\r\n * Desktop tool response interface\r\n * This is what the Electron app returns after executing the action\r\n */\r\nexport interface DesktopToolResponse {\r\n requiresDesktopExecution: true;\r\n action: string;\r\n args: Record<string, unknown>;\r\n toolCallId?: string;\r\n}\r\n\r\n/**\r\n * Options for creating desktop tools\r\n */\r\nexport interface CreateDesktopToolsOptions {\r\n /**\r\n * Optional callback that waits for desktop action results.\r\n * When provided, tools will await this callback to get actual results from the Electron app.\r\n * When not provided, tools return markers immediately (for non-server contexts).\r\n */\r\n waitForResult?: DesktopToolCallback;\r\n}\r\n\r\n/**\r\n * Format desktop action result for LLM consumption\r\n */\r\nfunction formatResultForLLM(\r\n result: DesktopActionResult,\r\n action: string\r\n): string {\r\n if (!result.success && result.error) {\r\n return `Desktop action \"${action}\" failed: ${result.error}`;\r\n }\r\n\r\n const parts: string[] = [];\r\n\r\n if (result.screenshot) {\r\n parts.push(\r\n `Screenshot captured (${result.screenshot.width}x${result.screenshot.height})`\r\n );\r\n // The base64 image will be handled separately by the message formatter\r\n }\r\n\r\n if (result.activeWindow) {\r\n parts.push(`**Active Window:**`);\r\n parts.push(` - Title: ${result.activeWindow.title}`);\r\n parts.push(` - App: ${result.activeWindow.app}`);\r\n if (result.activeWindow.bounds) {\r\n const b = result.activeWindow.bounds;\r\n parts.push(` - Position: (${b.x}, ${b.y})`);\r\n parts.push(` - Size: ${b.width}x${b.height}`);\r\n }\r\n }\r\n\r\n if (result.mousePosition) {\r\n parts.push(\r\n `**Mouse Position:** (${result.mousePosition.x}, ${result.mousePosition.y})`\r\n );\r\n }\r\n\r\n if (result.clipboard !== undefined) {\r\n parts.push(`**Clipboard Content:** ${result.clipboard}`);\r\n }\r\n\r\n if (parts.length === 0) {\r\n parts.push(`Desktop action \"${action}\" completed successfully.`);\r\n }\r\n\r\n return parts.join('\\n');\r\n}\r\n\r\n/**\r\n * Create desktop automation tools for the agent\r\n * These tools allow AI to control the user's desktop when Ranger Desktop is running\r\n */\r\nexport function createDesktopTools(\r\n options: CreateDesktopToolsOptions = {}\r\n): DynamicStructuredTool[] {\r\n const { waitForResult } = options;\r\n const tools: DynamicStructuredTool[] = [];\r\n\r\n /**\r\n * Helper to create tool function that optionally waits for results\r\n * The toolCallId is extracted from the RunnableConfig passed by LangChain\r\n */\r\n const createToolFunction = (action: string) => {\r\n return async (\r\n args: Record<string, unknown>,\r\n config?: { toolCall?: { id?: string } }\r\n ): Promise<string> => {\r\n const toolCallId =\r\n config?.toolCall?.id ??\r\n `desktop_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n\r\n // Create marker for Electron app\r\n const marker: DesktopToolResponse = {\r\n requiresDesktopExecution: true,\r\n action,\r\n args,\r\n toolCallId,\r\n };\r\n\r\n // If no callback, return marker immediately (Electron handles via SSE interception)\r\n if (!waitForResult) {\r\n return JSON.stringify(marker);\r\n }\r\n\r\n // With callback: wait for actual results from Electron app\r\n try {\r\n const result = await waitForResult(action, args, toolCallId);\r\n return formatResultForLLM(result, action);\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : String(error);\r\n return `Desktop action \"${action}\" failed: ${errorMessage}`;\r\n }\r\n };\r\n };\r\n\r\n // computer_screenshot\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.SCREENSHOT), {\r\n name: EDesktopTools.SCREENSHOT,\r\n description:\r\n 'Take a screenshot of the entire screen. Use this to see what is currently displayed on the desktop.',\r\n schema: ScreenshotSchema,\r\n })\r\n );\r\n\r\n // computer_click\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.CLICK), {\r\n name: EDesktopTools.CLICK,\r\n description:\r\n 'Click the mouse at the specified screen coordinates. Use screenshot first to identify the target location.',\r\n schema: ClickSchema,\r\n })\r\n );\r\n\r\n // computer_double_click\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.DOUBLE_CLICK), {\r\n name: EDesktopTools.DOUBLE_CLICK,\r\n description:\r\n 'Double-click the mouse at the specified screen coordinates.',\r\n schema: DoubleClickSchema,\r\n })\r\n );\r\n\r\n // computer_right_click\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.RIGHT_CLICK), {\r\n name: EDesktopTools.RIGHT_CLICK,\r\n description:\r\n 'Right-click the mouse at the specified screen coordinates to open context menus.',\r\n schema: RightClickSchema,\r\n })\r\n );\r\n\r\n // computer_type\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.TYPE), {\r\n name: EDesktopTools.TYPE,\r\n description:\r\n 'Type text using the keyboard. Make sure the target input field is focused first (use click).',\r\n schema: TypeSchema,\r\n })\r\n );\r\n\r\n // computer_key\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.KEY), {\r\n name: EDesktopTools.KEY,\r\n description:\r\n 'Press a single key on the keyboard (Enter, Tab, Escape, arrow keys, function keys, etc.).',\r\n schema: KeySchema,\r\n })\r\n );\r\n\r\n // computer_key_combo\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.KEY_COMBO), {\r\n name: EDesktopTools.KEY_COMBO,\r\n description:\r\n 'Press a key combination (e.g., Ctrl+C to copy, Ctrl+V to paste, Alt+Tab to switch windows).',\r\n schema: KeyComboSchema,\r\n })\r\n );\r\n\r\n // computer_scroll\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.SCROLL), {\r\n name: EDesktopTools.SCROLL,\r\n description:\r\n 'Scroll at the specified screen coordinates. Use negative deltaY to scroll up, positive to scroll down.',\r\n schema: ScrollSchema,\r\n })\r\n );\r\n\r\n // computer_drag\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.DRAG), {\r\n name: EDesktopTools.DRAG,\r\n description:\r\n 'Drag the mouse from one position to another (for moving windows, selecting text, etc.).',\r\n schema: DragSchema,\r\n })\r\n );\r\n\r\n // computer_get_active_window\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.GET_ACTIVE_WINDOW), {\r\n name: EDesktopTools.GET_ACTIVE_WINDOW,\r\n description:\r\n 'Get information about the currently active window (title, application name, position, size).',\r\n schema: GetActiveWindowSchema,\r\n })\r\n );\r\n\r\n // computer_get_mouse_position\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.GET_MOUSE_POSITION), {\r\n name: EDesktopTools.GET_MOUSE_POSITION,\r\n description: 'Get the current mouse cursor position on screen.',\r\n schema: GetMousePositionSchema,\r\n })\r\n );\r\n\r\n // clipboard_read\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.CLIPBOARD_READ), {\r\n name: EDesktopTools.CLIPBOARD_READ,\r\n description: 'Read the current contents of the system clipboard.',\r\n schema: ClipboardReadSchema,\r\n })\r\n );\r\n\r\n // clipboard_write\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.CLIPBOARD_WRITE), {\r\n name: EDesktopTools.CLIPBOARD_WRITE,\r\n description: 'Write text to the system clipboard.',\r\n schema: ClipboardWriteSchema,\r\n })\r\n );\r\n\r\n // clipboard_paste\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.CLIPBOARD_PASTE), {\r\n name: EDesktopTools.CLIPBOARD_PASTE,\r\n description:\r\n 'Paste the clipboard contents (equivalent to Ctrl+V). Use clipboard_write first to set the content.',\r\n schema: ClipboardPasteSchema,\r\n })\r\n );\r\n\r\n // computer_wait\r\n tools.push(\r\n tool(createToolFunction(EDesktopTools.WAIT), {\r\n name: EDesktopTools.WAIT,\r\n description:\r\n 'Wait for the specified number of milliseconds. Use this to wait for UI animations or loading.',\r\n schema: WaitSchema,\r\n })\r\n );\r\n\r\n return tools;\r\n}\r\n\r\n/**\r\n * Get all desktop tool names\r\n */\r\nexport function getDesktopToolNames(): DesktopToolName[] {\r\n return Object.values(EDesktopTools);\r\n}\r\n\r\n/**\r\n * Check if a tool name is a desktop tool\r\n */\r\nexport function isDesktopTool(name: string): name is DesktopToolName {\r\n return Object.values(EDesktopTools).includes(name as DesktopToolName);\r\n}\r\n"],"names":["z","tools","tool"],"mappings":"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"}