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,415 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/integrations/llamaindex/index.ts
31
+ var llamaindex_exports = {};
32
+ __export(llamaindex_exports, {
33
+ getLlamaIndexTools: () => getLlamaIndexTools
34
+ });
35
+ module.exports = __toCommonJS(llamaindex_exports);
36
+
37
+ // src/integrations/_instavmToolsCore.ts
38
+ var INSTAVM_OPENAI_TOOLS = [
39
+ {
40
+ type: "function",
41
+ function: {
42
+ name: "create_browser_session",
43
+ description: "Create a new browser session for web automation",
44
+ parameters: {
45
+ type: "object",
46
+ properties: {
47
+ width: { type: "integer", description: "Browser width", default: 1920 },
48
+ height: { type: "integer", description: "Browser height", default: 1080 }
49
+ }
50
+ }
51
+ }
52
+ },
53
+ {
54
+ type: "function",
55
+ function: {
56
+ name: "navigate_to_url",
57
+ description: "Navigate browser to URL",
58
+ parameters: {
59
+ type: "object",
60
+ properties: { url: { type: "string", description: "URL to navigate to" } },
61
+ required: ["url"]
62
+ }
63
+ }
64
+ },
65
+ {
66
+ type: "function",
67
+ function: {
68
+ name: "extract_page_content",
69
+ description: "Extract text content from page",
70
+ parameters: {
71
+ type: "object",
72
+ properties: {
73
+ selector: { type: "string", description: "CSS selector", default: "body" },
74
+ max_length: { type: "integer", description: "Max content length", default: 1e4 }
75
+ }
76
+ }
77
+ }
78
+ },
79
+ {
80
+ type: "function",
81
+ function: {
82
+ name: "extract_elements",
83
+ description: "Extract elements using CSS selector",
84
+ parameters: {
85
+ type: "object",
86
+ properties: {
87
+ selector: { type: "string", description: "CSS selector" },
88
+ attributes: {
89
+ type: "array",
90
+ items: { type: "string" },
91
+ description: "Attributes to extract",
92
+ default: ["text"]
93
+ },
94
+ max_results: { type: "integer", description: "Max results", default: 10 }
95
+ },
96
+ required: ["selector"]
97
+ }
98
+ }
99
+ },
100
+ {
101
+ type: "function",
102
+ function: {
103
+ name: "click_element",
104
+ description: "Click a page element",
105
+ parameters: {
106
+ type: "object",
107
+ properties: {
108
+ selector: { type: "string", description: "CSS selector" },
109
+ timeout: { type: "integer", description: "Timeout ms", default: 1e4 }
110
+ },
111
+ required: ["selector"]
112
+ }
113
+ }
114
+ },
115
+ {
116
+ type: "function",
117
+ function: {
118
+ name: "take_screenshot",
119
+ description: "Take page screenshot",
120
+ parameters: {
121
+ type: "object",
122
+ properties: {
123
+ full_page: { type: "boolean", description: "Full page capture", default: true }
124
+ }
125
+ }
126
+ }
127
+ },
128
+ {
129
+ type: "function",
130
+ function: {
131
+ name: "execute_python_code",
132
+ description: "Execute Python code. Use !command for bash (e.g., !pip install pandas)",
133
+ parameters: {
134
+ type: "object",
135
+ properties: { code: { type: "string", description: "Python/bash code to execute" } },
136
+ required: ["code"]
137
+ }
138
+ }
139
+ },
140
+ {
141
+ type: "function",
142
+ function: {
143
+ name: "scroll_page",
144
+ description: "Scroll page",
145
+ parameters: {
146
+ type: "object",
147
+ properties: {
148
+ x: { type: "integer", default: 0 },
149
+ y: { type: "integer", default: 500 }
150
+ }
151
+ }
152
+ }
153
+ },
154
+ {
155
+ type: "function",
156
+ function: {
157
+ name: "wait_for_element",
158
+ description: "Wait for element to appear",
159
+ parameters: {
160
+ type: "object",
161
+ properties: {
162
+ selector: { type: "string", description: "CSS selector" },
163
+ timeout: { type: "integer", default: 1e4 }
164
+ },
165
+ required: ["selector"]
166
+ }
167
+ }
168
+ }
169
+ ];
170
+ function serializeExecution(result) {
171
+ return {
172
+ stdout: result.stdout,
173
+ stderr: result.stderr,
174
+ success: result.success,
175
+ executionTime: result.executionTime,
176
+ cpuTime: result.cpuTime,
177
+ sessionId: result.sessionId,
178
+ error: result.error
179
+ };
180
+ }
181
+ function parseArgs(raw) {
182
+ if (!raw || !raw.trim()) return {};
183
+ try {
184
+ const v = JSON.parse(raw);
185
+ return v && typeof v === "object" && !Array.isArray(v) ? v : {};
186
+ } catch {
187
+ return {};
188
+ }
189
+ }
190
+ async function executeInstavmToolCall(instavm, toolCall, browserSession) {
191
+ const functionName = toolCall.function.name;
192
+ const arguments_ = parseArgs(toolCall.function.arguments);
193
+ try {
194
+ if (functionName === "create_browser_session") {
195
+ const width = Number(arguments_.width ?? 1920);
196
+ const height = Number(arguments_.height ?? 1080);
197
+ const session = await instavm.browser.createSession({ viewportWidth: width, viewportHeight: height });
198
+ return {
199
+ success: true,
200
+ session_id: session.sessionId,
201
+ session,
202
+ message: `Created browser session ${session.sessionId}`
203
+ };
204
+ }
205
+ if (functionName === "navigate_to_url") {
206
+ if (!browserSession) {
207
+ return { success: false, error: "No browser session. Create one first." };
208
+ }
209
+ const url = String(arguments_.url ?? "");
210
+ const result = await browserSession.navigate(url);
211
+ return { success: true, message: `Navigated to ${url}`, result };
212
+ }
213
+ if (functionName === "extract_page_content") {
214
+ if (!browserSession) {
215
+ return { success: false, error: "No browser session active" };
216
+ }
217
+ const selector = String(arguments_.selector ?? "body");
218
+ const maxLength = Number(arguments_.max_length ?? 1e4);
219
+ const elements = await browserSession.extractElements(selector, ["text"]);
220
+ if (elements?.length) {
221
+ const first = elements[0];
222
+ const text = String(first.text ?? first.content ?? "").slice(0, maxLength);
223
+ return { success: true, content: text, length: text.length };
224
+ }
225
+ return { success: false, error: "No content found" };
226
+ }
227
+ if (functionName === "extract_elements") {
228
+ if (!browserSession) {
229
+ return { success: false, error: "No browser session active" };
230
+ }
231
+ const selector = String(arguments_.selector ?? "");
232
+ const attributes = arguments_.attributes ?? ["text"];
233
+ const maxResults = Number(arguments_.max_results ?? 10);
234
+ const elements = await browserSession.extractElements(selector, attributes);
235
+ const list = Array.isArray(elements) ? elements : [];
236
+ return { success: true, elements: list.slice(0, maxResults), count: list.length };
237
+ }
238
+ if (functionName === "click_element") {
239
+ if (!browserSession) {
240
+ return { success: false, error: "No browser session active" };
241
+ }
242
+ const selector = String(arguments_.selector ?? "");
243
+ const timeout = Number(arguments_.timeout ?? 1e4);
244
+ await browserSession.click(selector, { timeout });
245
+ return { success: true, message: `Clicked ${selector}` };
246
+ }
247
+ if (functionName === "take_screenshot") {
248
+ if (!browserSession) {
249
+ return { success: false, error: "No browser session active" };
250
+ }
251
+ const fullPage = arguments_.full_page !== false;
252
+ const screenshot = await browserSession.screenshot({ fullPage });
253
+ return { success: true, screenshot_length: screenshot.length, screenshot };
254
+ }
255
+ if (functionName === "execute_python_code") {
256
+ const code = String(arguments_.code ?? "");
257
+ const result = await instavm.execute(code, { language: "python" });
258
+ return { success: true, output: serializeExecution(result) };
259
+ }
260
+ if (functionName === "scroll_page") {
261
+ if (!browserSession) {
262
+ return { success: false, error: "No browser session active" };
263
+ }
264
+ const x = Number(arguments_.x ?? 0);
265
+ const y = Number(arguments_.y ?? 500);
266
+ await browserSession.scroll({ x, y });
267
+ return { success: true, message: `Scrolled to (${x}, ${y})` };
268
+ }
269
+ if (functionName === "wait_for_element") {
270
+ if (!browserSession) {
271
+ return { success: false, error: "No browser session active" };
272
+ }
273
+ const selector = String(arguments_.selector ?? "");
274
+ const timeout = Number(arguments_.timeout ?? 1e4);
275
+ const result = await browserSession.waitFor("visible", selector, timeout);
276
+ return { success: true, message: `Element ${selector} visible`, result };
277
+ }
278
+ return { success: false, error: `Unknown function: ${functionName}` };
279
+ } catch (e) {
280
+ const msg = e instanceof Error ? e.message : String(e);
281
+ return { success: false, error: `Function ${functionName} failed: ${msg}` };
282
+ }
283
+ }
284
+ var INSTAVM_OLLAMA_TOOLS = INSTAVM_OPENAI_TOOLS.filter(
285
+ (t) => ["create_browser_session", "navigate_to_url", "extract_page_content", "extract_elements", "execute_python_code", "take_screenshot"].includes(
286
+ t.function.name
287
+ )
288
+ );
289
+
290
+ // src/integrations/llamaindex/index.ts
291
+ async function loadLlamaIndexTool() {
292
+ const { z } = await import("zod").catch(() => {
293
+ throw new Error("Optional peer missing: install zod (npm install zod)");
294
+ });
295
+ try {
296
+ const mod = await import("llamaindex");
297
+ if (typeof mod.tool === "function") {
298
+ return { tool: mod.tool, z };
299
+ }
300
+ } catch {
301
+ }
302
+ throw new Error("Optional peers missing: install llamaindex and zod (npm install llamaindex zod).");
303
+ }
304
+ async function getLlamaIndexTools(instavm) {
305
+ const { tool, z } = await loadLlamaIndexTool();
306
+ const browserSession = { current: null };
307
+ const run = async (name, args) => {
308
+ const toolCall = {
309
+ function: { name, arguments: JSON.stringify(args ?? {}) }
310
+ };
311
+ const out = await executeInstavmToolCall(instavm, toolCall, browserSession.current);
312
+ if (out.session) {
313
+ browserSession.current = out.session;
314
+ }
315
+ if (out.success === false && typeof out.error === "string") {
316
+ return out.error;
317
+ }
318
+ if (name === "create_browser_session" && typeof out.message === "string") return out.message;
319
+ if (name === "navigate_to_url" && typeof out.message === "string") return out.message;
320
+ if (name === "extract_page_content" && typeof out.content === "string") return out.content;
321
+ if (name === "extract_elements") {
322
+ const el = out.elements;
323
+ const count = out.count;
324
+ return JSON.stringify({ elements: el, count });
325
+ }
326
+ if (name === "click_element" && typeof out.message === "string") return out.message;
327
+ if (name === "take_screenshot" && typeof out.screenshot_length === "number") {
328
+ return `Screenshot taken (${out.screenshot_length} chars)`;
329
+ }
330
+ if (name === "execute_python_code") return String(JSON.stringify(out.output ?? out));
331
+ if (name === "scroll_page" && typeof out.message === "string") return out.message;
332
+ if (name === "wait_for_element" && typeof out.message === "string") return out.message;
333
+ return JSON.stringify(out);
334
+ };
335
+ return [
336
+ tool({
337
+ name: "create_browser_session",
338
+ description: "Create a new browser session for web automation",
339
+ parameters: z.object({
340
+ width: z.number().optional().default(1920),
341
+ height: z.number().optional().default(1080)
342
+ }),
343
+ execute: async (a) => run("create_browser_session", a)
344
+ }),
345
+ tool({
346
+ name: "navigate_to_url",
347
+ description: "Navigate browser to a URL",
348
+ parameters: z.object({ url: z.string() }),
349
+ execute: async (a) => run("navigate_to_url", a)
350
+ }),
351
+ tool({
352
+ name: "extract_page_content",
353
+ description: "Extract text content from current page",
354
+ parameters: z.object({
355
+ selector: z.string().optional().default("body"),
356
+ max_length: z.number().optional().default(1e4)
357
+ }),
358
+ execute: async (a) => run("extract_page_content", a)
359
+ }),
360
+ tool({
361
+ name: "extract_elements",
362
+ description: "Extract elements using CSS selectors",
363
+ parameters: z.object({
364
+ selector: z.string(),
365
+ attributes: z.array(z.string()).optional().default(["text"]),
366
+ max_results: z.number().optional().default(10)
367
+ }),
368
+ execute: async (a) => run("extract_elements", a)
369
+ }),
370
+ tool({
371
+ name: "click_element",
372
+ description: "Click a page element",
373
+ parameters: z.object({
374
+ selector: z.string(),
375
+ timeout: z.number().optional().default(1e4)
376
+ }),
377
+ execute: async (a) => run("click_element", a)
378
+ }),
379
+ tool({
380
+ name: "take_screenshot",
381
+ description: "Take a screenshot of current page",
382
+ parameters: z.object({ full_page: z.boolean().optional().default(true) }),
383
+ execute: async (a) => run("take_screenshot", a)
384
+ }),
385
+ tool({
386
+ name: "execute_python_code",
387
+ description: "Execute Python code in the cloud. Use !command for bash",
388
+ parameters: z.object({ code: z.string() }),
389
+ execute: async (a) => run("execute_python_code", a)
390
+ }),
391
+ tool({
392
+ name: "scroll_page",
393
+ description: "Scroll the page to coordinates",
394
+ parameters: z.object({
395
+ x: z.number().optional().default(0),
396
+ y: z.number().optional().default(500)
397
+ }),
398
+ execute: async (a) => run("scroll_page", a)
399
+ }),
400
+ tool({
401
+ name: "wait_for_element",
402
+ description: "Wait for element to become visible",
403
+ parameters: z.object({
404
+ selector: z.string(),
405
+ timeout: z.number().optional().default(1e4)
406
+ }),
407
+ execute: async (a) => run("wait_for_element", a)
408
+ })
409
+ ];
410
+ }
411
+ // Annotate the CommonJS export names for ESM import in node:
412
+ 0 && (module.exports = {
413
+ getLlamaIndexTools
414
+ });
415
+ //# sourceMappingURL=llamaindex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/integrations/llamaindex/index.ts","../../src/integrations/_instavmToolsCore.ts"],"sourcesContent":["import type { InstaVM } from '../../client/InstaVM';\nimport type { BrowserSession } from '../../client/BrowserSession';\nimport { executeInstavmToolCall, type ToolCallLike } from '../_instavmToolsCore';\n\ntype ToolFromCore = (config: {\n name: string;\n description: string;\n parameters: unknown;\n execute: (args: Record<string, unknown>) => Promise<string> | string;\n}) => unknown;\n\nasync function loadLlamaIndexTool(): Promise<{ tool: ToolFromCore; z: typeof import('zod').z }> {\n const { z } = await import('zod').catch(() => {\n throw new Error('Optional peer missing: install zod (npm install zod)');\n });\n\n try {\n const mod = (await import('llamaindex')) as { tool?: ToolFromCore };\n if (typeof mod.tool === 'function') {\n return { tool: mod.tool, z };\n }\n } catch {\n /* fall through */\n }\n\n throw new Error('Optional peers missing: install llamaindex and zod (npm install llamaindex zod).');\n}\n\n/**\n * LlamaIndex.TS tools (optional peers `@llamaindex/core` + `zod`, or `llamaindex`).\n * Mirrors Python `get_llamaindex_tools`.\n */\nexport async function getLlamaIndexTools(instavm: InstaVM): Promise<unknown[]> {\n const { tool, z } = await loadLlamaIndexTool();\n\n const browserSession: { current: BrowserSession | null } = { current: null };\n\n const run = async (name: string, args: Record<string, unknown>) => {\n const toolCall: ToolCallLike = {\n function: { name, arguments: JSON.stringify(args ?? {}) },\n };\n const out = await executeInstavmToolCall(instavm, toolCall, browserSession.current);\n if (out.session) {\n browserSession.current = out.session;\n }\n if (out.success === false && typeof out.error === 'string') {\n return out.error;\n }\n if (name === 'create_browser_session' && typeof out.message === 'string') return out.message;\n if (name === 'navigate_to_url' && typeof out.message === 'string') return out.message;\n if (name === 'extract_page_content' && typeof out.content === 'string') return out.content;\n if (name === 'extract_elements') {\n const el = out.elements;\n const count = out.count;\n return JSON.stringify({ elements: el, count });\n }\n if (name === 'click_element' && typeof out.message === 'string') return out.message;\n if (name === 'take_screenshot' && typeof out.screenshot_length === 'number') {\n return `Screenshot taken (${out.screenshot_length} chars)`;\n }\n if (name === 'execute_python_code') return String(JSON.stringify(out.output ?? out));\n if (name === 'scroll_page' && typeof out.message === 'string') return out.message;\n if (name === 'wait_for_element' && typeof out.message === 'string') return out.message;\n return JSON.stringify(out);\n };\n\n return [\n tool({\n name: 'create_browser_session',\n description: 'Create a new browser session for web automation',\n parameters: z.object({\n width: z.number().optional().default(1920),\n height: z.number().optional().default(1080),\n }),\n execute: async (a) => run('create_browser_session', a as Record<string, unknown>),\n }),\n tool({\n name: 'navigate_to_url',\n description: 'Navigate browser to a URL',\n parameters: z.object({ url: z.string() }),\n execute: async (a) => run('navigate_to_url', a as Record<string, unknown>),\n }),\n tool({\n name: 'extract_page_content',\n description: 'Extract text content from current page',\n parameters: z.object({\n selector: z.string().optional().default('body'),\n max_length: z.number().optional().default(10_000),\n }),\n execute: async (a) => run('extract_page_content', a as Record<string, unknown>),\n }),\n tool({\n name: 'extract_elements',\n description: 'Extract elements using CSS selectors',\n parameters: z.object({\n selector: z.string(),\n attributes: z.array(z.string()).optional().default(['text']),\n max_results: z.number().optional().default(10),\n }),\n execute: async (a) => run('extract_elements', a as Record<string, unknown>),\n }),\n tool({\n name: 'click_element',\n description: 'Click a page element',\n parameters: z.object({\n selector: z.string(),\n timeout: z.number().optional().default(10_000),\n }),\n execute: async (a) => run('click_element', a as Record<string, unknown>),\n }),\n tool({\n name: 'take_screenshot',\n description: 'Take a screenshot of current page',\n parameters: z.object({ full_page: z.boolean().optional().default(true) }),\n execute: async (a) => run('take_screenshot', a as Record<string, unknown>),\n }),\n tool({\n name: 'execute_python_code',\n description: 'Execute Python code in the cloud. Use !command for bash',\n parameters: z.object({ code: z.string() }),\n execute: async (a) => run('execute_python_code', a as Record<string, unknown>),\n }),\n tool({\n name: 'scroll_page',\n description: 'Scroll the page to coordinates',\n parameters: z.object({\n x: z.number().optional().default(0),\n y: z.number().optional().default(500),\n }),\n execute: async (a) => run('scroll_page', a as Record<string, unknown>),\n }),\n tool({\n name: 'wait_for_element',\n description: 'Wait for element to become visible',\n parameters: z.object({\n selector: z.string(),\n timeout: z.number().optional().default(10_000),\n }),\n execute: async (a) => run('wait_for_element', a as Record<string, unknown>),\n }),\n ];\n}\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":[]}