instavm 0.16.0 → 0.17.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.
Files changed (50) hide show
  1. package/README.md +86 -9
  2. package/dist/InstaVM-DjkmUcaP.d.mts +1393 -0
  3. package/dist/InstaVM-DjkmUcaP.d.ts +1393 -0
  4. package/dist/_instavmToolsCore-34H4iqVZ.d.mts +26 -0
  5. package/dist/_instavmToolsCore-BuaJyxXB.d.ts +26 -0
  6. package/dist/cli.js +5821 -2296
  7. package/dist/cli.js.map +1 -1
  8. package/dist/index.d.mts +12 -919
  9. package/dist/index.d.ts +12 -919
  10. package/dist/index.js +1464 -140
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +1449 -135
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/integrations/azure-openai.d.mts +18 -0
  15. package/dist/integrations/azure-openai.d.ts +18 -0
  16. package/dist/integrations/azure-openai.js +332 -0
  17. package/dist/integrations/azure-openai.js.map +1 -0
  18. package/dist/integrations/azure-openai.mjs +299 -0
  19. package/dist/integrations/azure-openai.mjs.map +1 -0
  20. package/dist/integrations/langchain.d.mts +7 -0
  21. package/dist/integrations/langchain.d.ts +7 -0
  22. package/dist/integrations/langchain.js +364 -0
  23. package/dist/integrations/langchain.js.map +1 -0
  24. package/dist/integrations/langchain.mjs +327 -0
  25. package/dist/integrations/langchain.mjs.map +1 -0
  26. package/dist/integrations/llamaindex.d.mts +11 -0
  27. package/dist/integrations/llamaindex.d.ts +11 -0
  28. package/dist/integrations/llamaindex.js +415 -0
  29. package/dist/integrations/llamaindex.js.map +1 -0
  30. package/dist/integrations/llamaindex.mjs +378 -0
  31. package/dist/integrations/llamaindex.mjs.map +1 -0
  32. package/dist/integrations/ollama.d.mts +35 -0
  33. package/dist/integrations/ollama.d.ts +35 -0
  34. package/dist/integrations/ollama.js +421 -0
  35. package/dist/integrations/ollama.js.map +1 -0
  36. package/dist/integrations/ollama.mjs +391 -0
  37. package/dist/integrations/ollama.mjs.map +1 -0
  38. package/dist/integrations/openai.d.mts +19 -0
  39. package/dist/integrations/openai.d.ts +19 -0
  40. package/dist/integrations/openai.js +302 -0
  41. package/dist/integrations/openai.js.map +1 -0
  42. package/dist/integrations/openai.mjs +272 -0
  43. package/dist/integrations/openai.mjs.map +1 -0
  44. package/package.json +44 -3
  45. package/dist/integrations/openai/index.d.mts +0 -16
  46. package/dist/integrations/openai/index.d.ts +0 -16
  47. package/dist/integrations/openai/index.js +0 -38
  48. package/dist/integrations/openai/index.js.map +0 -1
  49. package/dist/integrations/openai/index.mjs +0 -12
  50. package/dist/integrations/openai/index.mjs.map +0 -1
@@ -0,0 +1,18 @@
1
+ import { I as InstaVM, b as BrowserSession } from '../InstaVM-DjkmUcaP.mjs';
2
+ import { I as InstaVMOpenAITool, T as ToolCallLike } from '../_instavmToolsCore-34H4iqVZ.mjs';
3
+ import 'form-data';
4
+ import 'eventemitter3';
5
+
6
+ /** Same schema as OpenAI tools (Azure uses the same JSON). */
7
+ declare function getAzureTools(): InstaVMOpenAITool[];
8
+ declare const getOpenAITools: typeof getAzureTools;
9
+ declare function executeAzureTool(instavm: InstaVM, toolCall: ToolCallLike, browserSession?: BrowserSession | null): Promise<Record<string, unknown> & {
10
+ session?: BrowserSession;
11
+ }>;
12
+ declare const executeTool: typeof executeAzureTool;
13
+ declare const executeToolCall: typeof executeAzureTool;
14
+ /** Optimized system prompt (parity with Python `get_system_prompt`). */
15
+ declare function getSystemPrompt(): string;
16
+ declare const getAzureSystemPrompt: typeof getSystemPrompt;
17
+
18
+ export { InstaVMOpenAITool, executeAzureTool, executeTool, executeToolCall, getAzureSystemPrompt, getAzureTools, getOpenAITools, getSystemPrompt };
@@ -0,0 +1,18 @@
1
+ import { I as InstaVM, b as BrowserSession } from '../InstaVM-DjkmUcaP.js';
2
+ import { I as InstaVMOpenAITool, T as ToolCallLike } from '../_instavmToolsCore-BuaJyxXB.js';
3
+ import 'form-data';
4
+ import 'eventemitter3';
5
+
6
+ /** Same schema as OpenAI tools (Azure uses the same JSON). */
7
+ declare function getAzureTools(): InstaVMOpenAITool[];
8
+ declare const getOpenAITools: typeof getAzureTools;
9
+ declare function executeAzureTool(instavm: InstaVM, toolCall: ToolCallLike, browserSession?: BrowserSession | null): Promise<Record<string, unknown> & {
10
+ session?: BrowserSession;
11
+ }>;
12
+ declare const executeTool: typeof executeAzureTool;
13
+ declare const executeToolCall: typeof executeAzureTool;
14
+ /** Optimized system prompt (parity with Python `get_system_prompt`). */
15
+ declare function getSystemPrompt(): string;
16
+ declare const getAzureSystemPrompt: typeof getSystemPrompt;
17
+
18
+ export { InstaVMOpenAITool, executeAzureTool, executeTool, executeToolCall, getAzureSystemPrompt, getAzureTools, getOpenAITools, getSystemPrompt };
@@ -0,0 +1,332 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/integrations/azure-openai/index.ts
21
+ var azure_openai_exports = {};
22
+ __export(azure_openai_exports, {
23
+ executeAzureTool: () => executeAzureTool,
24
+ executeTool: () => executeTool,
25
+ executeToolCall: () => executeToolCall,
26
+ getAzureSystemPrompt: () => getAzureSystemPrompt,
27
+ getAzureTools: () => getAzureTools,
28
+ getOpenAITools: () => getOpenAITools,
29
+ getSystemPrompt: () => getSystemPrompt
30
+ });
31
+ module.exports = __toCommonJS(azure_openai_exports);
32
+
33
+ // src/integrations/_instavmToolsCore.ts
34
+ function getInstavmOpenAITools() {
35
+ return INSTAVM_OPENAI_TOOLS;
36
+ }
37
+ var INSTAVM_OPENAI_TOOLS = [
38
+ {
39
+ type: "function",
40
+ function: {
41
+ name: "create_browser_session",
42
+ description: "Create a new browser session for web automation",
43
+ parameters: {
44
+ type: "object",
45
+ properties: {
46
+ width: { type: "integer", description: "Browser width", default: 1920 },
47
+ height: { type: "integer", description: "Browser height", default: 1080 }
48
+ }
49
+ }
50
+ }
51
+ },
52
+ {
53
+ type: "function",
54
+ function: {
55
+ name: "navigate_to_url",
56
+ description: "Navigate browser to URL",
57
+ parameters: {
58
+ type: "object",
59
+ properties: { url: { type: "string", description: "URL to navigate to" } },
60
+ required: ["url"]
61
+ }
62
+ }
63
+ },
64
+ {
65
+ type: "function",
66
+ function: {
67
+ name: "extract_page_content",
68
+ description: "Extract text content from page",
69
+ parameters: {
70
+ type: "object",
71
+ properties: {
72
+ selector: { type: "string", description: "CSS selector", default: "body" },
73
+ max_length: { type: "integer", description: "Max content length", default: 1e4 }
74
+ }
75
+ }
76
+ }
77
+ },
78
+ {
79
+ type: "function",
80
+ function: {
81
+ name: "extract_elements",
82
+ description: "Extract elements using CSS selector",
83
+ parameters: {
84
+ type: "object",
85
+ properties: {
86
+ selector: { type: "string", description: "CSS selector" },
87
+ attributes: {
88
+ type: "array",
89
+ items: { type: "string" },
90
+ description: "Attributes to extract",
91
+ default: ["text"]
92
+ },
93
+ max_results: { type: "integer", description: "Max results", default: 10 }
94
+ },
95
+ required: ["selector"]
96
+ }
97
+ }
98
+ },
99
+ {
100
+ type: "function",
101
+ function: {
102
+ name: "click_element",
103
+ description: "Click a page element",
104
+ parameters: {
105
+ type: "object",
106
+ properties: {
107
+ selector: { type: "string", description: "CSS selector" },
108
+ timeout: { type: "integer", description: "Timeout ms", default: 1e4 }
109
+ },
110
+ required: ["selector"]
111
+ }
112
+ }
113
+ },
114
+ {
115
+ type: "function",
116
+ function: {
117
+ name: "take_screenshot",
118
+ description: "Take page screenshot",
119
+ parameters: {
120
+ type: "object",
121
+ properties: {
122
+ full_page: { type: "boolean", description: "Full page capture", default: true }
123
+ }
124
+ }
125
+ }
126
+ },
127
+ {
128
+ type: "function",
129
+ function: {
130
+ name: "execute_python_code",
131
+ description: "Execute Python code. Use !command for bash (e.g., !pip install pandas)",
132
+ parameters: {
133
+ type: "object",
134
+ properties: { code: { type: "string", description: "Python/bash code to execute" } },
135
+ required: ["code"]
136
+ }
137
+ }
138
+ },
139
+ {
140
+ type: "function",
141
+ function: {
142
+ name: "scroll_page",
143
+ description: "Scroll page",
144
+ parameters: {
145
+ type: "object",
146
+ properties: {
147
+ x: { type: "integer", default: 0 },
148
+ y: { type: "integer", default: 500 }
149
+ }
150
+ }
151
+ }
152
+ },
153
+ {
154
+ type: "function",
155
+ function: {
156
+ name: "wait_for_element",
157
+ description: "Wait for element to appear",
158
+ parameters: {
159
+ type: "object",
160
+ properties: {
161
+ selector: { type: "string", description: "CSS selector" },
162
+ timeout: { type: "integer", default: 1e4 }
163
+ },
164
+ required: ["selector"]
165
+ }
166
+ }
167
+ }
168
+ ];
169
+ function serializeExecution(result) {
170
+ return {
171
+ stdout: result.stdout,
172
+ stderr: result.stderr,
173
+ success: result.success,
174
+ executionTime: result.executionTime,
175
+ cpuTime: result.cpuTime,
176
+ sessionId: result.sessionId,
177
+ error: result.error
178
+ };
179
+ }
180
+ function parseArgs(raw) {
181
+ if (!raw || !raw.trim()) return {};
182
+ try {
183
+ const v = JSON.parse(raw);
184
+ return v && typeof v === "object" && !Array.isArray(v) ? v : {};
185
+ } catch {
186
+ return {};
187
+ }
188
+ }
189
+ async function executeInstavmToolCall(instavm, toolCall, browserSession) {
190
+ const functionName = toolCall.function.name;
191
+ const arguments_ = parseArgs(toolCall.function.arguments);
192
+ try {
193
+ if (functionName === "create_browser_session") {
194
+ const width = Number(arguments_.width ?? 1920);
195
+ const height = Number(arguments_.height ?? 1080);
196
+ const session = await instavm.browser.createSession({ viewportWidth: width, viewportHeight: height });
197
+ return {
198
+ success: true,
199
+ session_id: session.sessionId,
200
+ session,
201
+ message: `Created browser session ${session.sessionId}`
202
+ };
203
+ }
204
+ if (functionName === "navigate_to_url") {
205
+ if (!browserSession) {
206
+ return { success: false, error: "No browser session. Create one first." };
207
+ }
208
+ const url = String(arguments_.url ?? "");
209
+ const result = await browserSession.navigate(url);
210
+ return { success: true, message: `Navigated to ${url}`, result };
211
+ }
212
+ if (functionName === "extract_page_content") {
213
+ if (!browserSession) {
214
+ return { success: false, error: "No browser session active" };
215
+ }
216
+ const selector = String(arguments_.selector ?? "body");
217
+ const maxLength = Number(arguments_.max_length ?? 1e4);
218
+ const elements = await browserSession.extractElements(selector, ["text"]);
219
+ if (elements?.length) {
220
+ const first = elements[0];
221
+ const text = String(first.text ?? first.content ?? "").slice(0, maxLength);
222
+ return { success: true, content: text, length: text.length };
223
+ }
224
+ return { success: false, error: "No content found" };
225
+ }
226
+ if (functionName === "extract_elements") {
227
+ if (!browserSession) {
228
+ return { success: false, error: "No browser session active" };
229
+ }
230
+ const selector = String(arguments_.selector ?? "");
231
+ const attributes = arguments_.attributes ?? ["text"];
232
+ const maxResults = Number(arguments_.max_results ?? 10);
233
+ const elements = await browserSession.extractElements(selector, attributes);
234
+ const list = Array.isArray(elements) ? elements : [];
235
+ return { success: true, elements: list.slice(0, maxResults), count: list.length };
236
+ }
237
+ if (functionName === "click_element") {
238
+ if (!browserSession) {
239
+ return { success: false, error: "No browser session active" };
240
+ }
241
+ const selector = String(arguments_.selector ?? "");
242
+ const timeout = Number(arguments_.timeout ?? 1e4);
243
+ await browserSession.click(selector, { timeout });
244
+ return { success: true, message: `Clicked ${selector}` };
245
+ }
246
+ if (functionName === "take_screenshot") {
247
+ if (!browserSession) {
248
+ return { success: false, error: "No browser session active" };
249
+ }
250
+ const fullPage = arguments_.full_page !== false;
251
+ const screenshot = await browserSession.screenshot({ fullPage });
252
+ return { success: true, screenshot_length: screenshot.length, screenshot };
253
+ }
254
+ if (functionName === "execute_python_code") {
255
+ const code = String(arguments_.code ?? "");
256
+ const result = await instavm.execute(code, { language: "python" });
257
+ return { success: true, output: serializeExecution(result) };
258
+ }
259
+ if (functionName === "scroll_page") {
260
+ if (!browserSession) {
261
+ return { success: false, error: "No browser session active" };
262
+ }
263
+ const x = Number(arguments_.x ?? 0);
264
+ const y = Number(arguments_.y ?? 500);
265
+ await browserSession.scroll({ x, y });
266
+ return { success: true, message: `Scrolled to (${x}, ${y})` };
267
+ }
268
+ if (functionName === "wait_for_element") {
269
+ if (!browserSession) {
270
+ return { success: false, error: "No browser session active" };
271
+ }
272
+ const selector = String(arguments_.selector ?? "");
273
+ const timeout = Number(arguments_.timeout ?? 1e4);
274
+ const result = await browserSession.waitFor("visible", selector, timeout);
275
+ return { success: true, message: `Element ${selector} visible`, result };
276
+ }
277
+ return { success: false, error: `Unknown function: ${functionName}` };
278
+ } catch (e) {
279
+ const msg = e instanceof Error ? e.message : String(e);
280
+ return { success: false, error: `Function ${functionName} failed: ${msg}` };
281
+ }
282
+ }
283
+ var INSTAVM_OLLAMA_TOOLS = INSTAVM_OPENAI_TOOLS.filter(
284
+ (t) => ["create_browser_session", "navigate_to_url", "extract_page_content", "extract_elements", "execute_python_code", "take_screenshot"].includes(
285
+ t.function.name
286
+ )
287
+ );
288
+
289
+ // src/integrations/azure-openai/index.ts
290
+ function getAzureTools() {
291
+ return getInstavmOpenAITools();
292
+ }
293
+ var getOpenAITools = getAzureTools;
294
+ async function executeAzureTool(instavm, toolCall, browserSession) {
295
+ return executeInstavmToolCall(instavm, toolCall, browserSession);
296
+ }
297
+ var executeTool = executeAzureTool;
298
+ var executeToolCall = executeAzureTool;
299
+ function getSystemPrompt() {
300
+ return `
301
+ You are a web automation assistant with access to browser and code execution tools.
302
+
303
+ Available capabilities:
304
+ - create_browser_session: Start browser automation
305
+ - navigate_to_url: Go to any website
306
+ - extract_page_content: Get page text content
307
+ - extract_elements: Get specific elements by CSS selector
308
+ - click_element: Click page elements
309
+ - take_screenshot: Capture page images
310
+ - execute_python_code: Run Python/bash code (use !pip install for packages)
311
+ - scroll_page: Scroll to coordinates
312
+ - wait_for_element: Wait for elements to load
313
+
314
+ Tips:
315
+ - Always create browser session before navigation
316
+ - Install packages with !pip install before importing
317
+ - Use screenshots when text extraction isn't enough
318
+ - Be systematic and handle errors gracefully
319
+ `.trim();
320
+ }
321
+ var getAzureSystemPrompt = getSystemPrompt;
322
+ // Annotate the CommonJS export names for ESM import in node:
323
+ 0 && (module.exports = {
324
+ executeAzureTool,
325
+ executeTool,
326
+ executeToolCall,
327
+ getAzureSystemPrompt,
328
+ getAzureTools,
329
+ getOpenAITools,
330
+ getSystemPrompt
331
+ });
332
+ //# sourceMappingURL=azure-openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/integrations/azure-openai/index.ts","../../src/integrations/_instavmToolsCore.ts"],"sourcesContent":["import type { InstaVM } from '../../client/InstaVM';\nimport type { BrowserSession } from '../../client/BrowserSession';\nimport {\n executeInstavmToolCall,\n getInstavmOpenAITools,\n type InstaVMOpenAITool,\n type ToolCallLike,\n} from '../_instavmToolsCore';\n\nexport type { InstaVMOpenAITool };\n\n/** Same schema as OpenAI tools (Azure uses the same JSON). */\nexport function getAzureTools(): InstaVMOpenAITool[] {\n return getInstavmOpenAITools();\n}\n\nexport const getOpenAITools = getAzureTools;\n\nexport async function executeAzureTool(\n instavm: InstaVM,\n toolCall: ToolCallLike,\n browserSession?: BrowserSession | null,\n) {\n return executeInstavmToolCall(instavm, toolCall, browserSession);\n}\n\nexport const executeTool = executeAzureTool;\nexport const executeToolCall = executeAzureTool;\n\n/** Optimized system prompt (parity with Python `get_system_prompt`). */\nexport function getSystemPrompt(): string {\n return `\nYou are a web automation assistant with access to browser and code execution tools.\n\nAvailable capabilities:\n- create_browser_session: Start browser automation\n- navigate_to_url: Go to any website\n- extract_page_content: Get page text content\n- extract_elements: Get specific elements by CSS selector\n- click_element: Click page elements\n- take_screenshot: Capture page images\n- execute_python_code: Run Python/bash code (use !pip install for packages)\n- scroll_page: Scroll to coordinates\n- wait_for_element: Wait for elements to load\n\nTips:\n- Always create browser session before navigation\n- Install packages with !pip install before importing\n- Use screenshots when text extraction isn't enough\n- Be systematic and handle errors gracefully\n`.trim();\n}\n\nexport const getAzureSystemPrompt = getSystemPrompt;\n","import type { InstaVM } from '../client/InstaVM';\nimport type { BrowserSession } from '../client/BrowserSession';\nimport type { ExecutionResult } from '../types/execution';\n\n/** OpenAI / Azure / Ollama–compatible function tool schema. */\nexport type InstaVMOpenAITool = {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport function getInstavmOpenAITools(): InstaVMOpenAITool[] {\n return INSTAVM_OPENAI_TOOLS;\n}\n\nconst INSTAVM_OPENAI_TOOLS: InstaVMOpenAITool[] = [\n {\n type: 'function',\n function: {\n name: 'create_browser_session',\n description: 'Create a new browser session for web automation',\n parameters: {\n type: 'object',\n properties: {\n width: { type: 'integer', description: 'Browser width', default: 1920 },\n height: { type: 'integer', description: 'Browser height', default: 1080 },\n },\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'navigate_to_url',\n description: 'Navigate browser to URL',\n parameters: {\n type: 'object',\n properties: { url: { type: 'string', description: 'URL to navigate to' } },\n required: ['url'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'extract_page_content',\n description: 'Extract text content from page',\n parameters: {\n type: 'object',\n properties: {\n selector: { type: 'string', description: 'CSS selector', default: 'body' },\n max_length: { type: 'integer', description: 'Max content length', default: 10000 },\n },\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'extract_elements',\n description: 'Extract elements using CSS selector',\n parameters: {\n type: 'object',\n properties: {\n selector: { type: 'string', description: 'CSS selector' },\n attributes: {\n type: 'array',\n items: { type: 'string' },\n description: 'Attributes to extract',\n default: ['text'],\n },\n max_results: { type: 'integer', description: 'Max results', default: 10 },\n },\n required: ['selector'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'click_element',\n description: 'Click a page element',\n parameters: {\n type: 'object',\n properties: {\n selector: { type: 'string', description: 'CSS selector' },\n timeout: { type: 'integer', description: 'Timeout ms', default: 10000 },\n },\n required: ['selector'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'take_screenshot',\n description: 'Take page screenshot',\n parameters: {\n type: 'object',\n properties: {\n full_page: { type: 'boolean', description: 'Full page capture', default: true },\n },\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'execute_python_code',\n description: 'Execute Python code. Use !command for bash (e.g., !pip install pandas)',\n parameters: {\n type: 'object',\n properties: { code: { type: 'string', description: 'Python/bash code to execute' } },\n required: ['code'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'scroll_page',\n description: 'Scroll page',\n parameters: {\n type: 'object',\n properties: {\n x: { type: 'integer', default: 0 },\n y: { type: 'integer', default: 500 },\n },\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'wait_for_element',\n description: 'Wait for element to appear',\n parameters: {\n type: 'object',\n properties: {\n selector: { type: 'string', description: 'CSS selector' },\n timeout: { type: 'integer', default: 10000 },\n },\n required: ['selector'],\n },\n },\n },\n];\n\nfunction serializeExecution(result: ExecutionResult): Record<string, unknown> {\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n success: result.success,\n executionTime: result.executionTime,\n cpuTime: result.cpuTime,\n sessionId: result.sessionId,\n error: result.error,\n };\n}\n\nexport type ToolCallLike = {\n function: {\n name: string;\n arguments: string;\n };\n};\n\nfunction parseArgs(raw: string): Record<string, unknown> {\n if (!raw || !raw.trim()) return {};\n try {\n const v = JSON.parse(raw) as unknown;\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n}\n\n/**\n * Execute a single OpenAI-style tool call (parity with Python `execute_tool`).\n * Returns a dict; when a new browser session is created, `session` holds the `BrowserSession` instance.\n */\nexport async function executeInstavmToolCall(\n instavm: InstaVM,\n toolCall: ToolCallLike,\n browserSession?: BrowserSession | null,\n): Promise<Record<string, unknown> & { session?: BrowserSession }> {\n const functionName = toolCall.function.name;\n const arguments_ = parseArgs(toolCall.function.arguments);\n\n try {\n if (functionName === 'create_browser_session') {\n const width = Number(arguments_.width ?? 1920);\n const height = Number(arguments_.height ?? 1080);\n const session = await instavm.browser.createSession({ viewportWidth: width, viewportHeight: height });\n return {\n success: true,\n session_id: session.sessionId,\n session,\n message: `Created browser session ${session.sessionId}`,\n };\n }\n\n if (functionName === 'navigate_to_url') {\n if (!browserSession) {\n return { success: false, error: 'No browser session. Create one first.' };\n }\n const url = String(arguments_.url ?? '');\n const result = await browserSession.navigate(url);\n return { success: true, message: `Navigated to ${url}`, result };\n }\n\n if (functionName === 'extract_page_content') {\n if (!browserSession) {\n return { success: false, error: 'No browser session active' };\n }\n const selector = String(arguments_.selector ?? 'body');\n const maxLength = Number(arguments_.max_length ?? 10000);\n const elements = await browserSession.extractElements(selector, ['text']);\n if (elements?.length) {\n const first = elements[0] as Record<string, unknown>;\n const text = String(first.text ?? first.content ?? '').slice(0, maxLength);\n return { success: true, content: text, length: text.length };\n }\n return { success: false, error: 'No content found' };\n }\n\n if (functionName === 'extract_elements') {\n if (!browserSession) {\n return { success: false, error: 'No browser session active' };\n }\n const selector = String(arguments_.selector ?? '');\n const attributes = (arguments_.attributes as string[] | undefined) ?? ['text'];\n const maxResults = Number(arguments_.max_results ?? 10);\n const elements = await browserSession.extractElements(selector, attributes);\n const list = Array.isArray(elements) ? elements : [];\n return { success: true, elements: list.slice(0, maxResults), count: list.length };\n }\n\n if (functionName === 'click_element') {\n if (!browserSession) {\n return { success: false, error: 'No browser session active' };\n }\n const selector = String(arguments_.selector ?? '');\n const timeout = Number(arguments_.timeout ?? 10000);\n await browserSession.click(selector, { timeout });\n return { success: true, message: `Clicked ${selector}` };\n }\n\n if (functionName === 'take_screenshot') {\n if (!browserSession) {\n return { success: false, error: 'No browser session active' };\n }\n const fullPage = arguments_.full_page !== false;\n const screenshot = await browserSession.screenshot({ fullPage });\n return { success: true, screenshot_length: screenshot.length, screenshot };\n }\n\n if (functionName === 'execute_python_code') {\n const code = String(arguments_.code ?? '');\n const result = await instavm.execute(code, { language: 'python' });\n return { success: true, output: serializeExecution(result) };\n }\n\n if (functionName === 'scroll_page') {\n if (!browserSession) {\n return { success: false, error: 'No browser session active' };\n }\n const x = Number(arguments_.x ?? 0);\n const y = Number(arguments_.y ?? 500);\n await browserSession.scroll({ x, y });\n return { success: true, message: `Scrolled to (${x}, ${y})` };\n }\n\n if (functionName === 'wait_for_element') {\n if (!browserSession) {\n return { success: false, error: 'No browser session active' };\n }\n const selector = String(arguments_.selector ?? '');\n const timeout = Number(arguments_.timeout ?? 10000);\n const result = await browserSession.waitFor('visible', selector, timeout);\n return { success: true, message: `Element ${selector} visible`, result };\n }\n\n return { success: false, error: `Unknown function: ${functionName}` };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { success: false, error: `Function ${functionName} failed: ${msg}` };\n }\n}\n\n/** Subset of tools used by Ollama example in Python SDK. */\nexport const INSTAVM_OLLAMA_TOOLS: InstaVMOpenAITool[] = INSTAVM_OPENAI_TOOLS.filter((t) =>\n ['create_browser_session', 'navigate_to_url', 'extract_page_content', 'extract_elements', 'execute_python_code', 'take_screenshot'].includes(\n t.function.name,\n ),\n);\n\nexport async function executeOllamaStyleTool(\n instavm: InstaVM,\n functionName: string,\n arguments_: Record<string, unknown>,\n browserSession?: BrowserSession | null,\n): Promise<Record<string, unknown> & { session?: BrowserSession }> {\n return executeInstavmToolCall(\n instavm,\n { function: { name: functionName, arguments: JSON.stringify(arguments_ || {}) } },\n browserSession,\n );\n}\n"],"mappings":"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","names":[]}