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,391 @@
1
+ // src/integrations/_instavmToolsCore.ts
2
+ var INSTAVM_OPENAI_TOOLS = [
3
+ {
4
+ type: "function",
5
+ function: {
6
+ name: "create_browser_session",
7
+ description: "Create a new browser session for web automation",
8
+ parameters: {
9
+ type: "object",
10
+ properties: {
11
+ width: { type: "integer", description: "Browser width", default: 1920 },
12
+ height: { type: "integer", description: "Browser height", default: 1080 }
13
+ }
14
+ }
15
+ }
16
+ },
17
+ {
18
+ type: "function",
19
+ function: {
20
+ name: "navigate_to_url",
21
+ description: "Navigate browser to URL",
22
+ parameters: {
23
+ type: "object",
24
+ properties: { url: { type: "string", description: "URL to navigate to" } },
25
+ required: ["url"]
26
+ }
27
+ }
28
+ },
29
+ {
30
+ type: "function",
31
+ function: {
32
+ name: "extract_page_content",
33
+ description: "Extract text content from page",
34
+ parameters: {
35
+ type: "object",
36
+ properties: {
37
+ selector: { type: "string", description: "CSS selector", default: "body" },
38
+ max_length: { type: "integer", description: "Max content length", default: 1e4 }
39
+ }
40
+ }
41
+ }
42
+ },
43
+ {
44
+ type: "function",
45
+ function: {
46
+ name: "extract_elements",
47
+ description: "Extract elements using CSS selector",
48
+ parameters: {
49
+ type: "object",
50
+ properties: {
51
+ selector: { type: "string", description: "CSS selector" },
52
+ attributes: {
53
+ type: "array",
54
+ items: { type: "string" },
55
+ description: "Attributes to extract",
56
+ default: ["text"]
57
+ },
58
+ max_results: { type: "integer", description: "Max results", default: 10 }
59
+ },
60
+ required: ["selector"]
61
+ }
62
+ }
63
+ },
64
+ {
65
+ type: "function",
66
+ function: {
67
+ name: "click_element",
68
+ description: "Click a page element",
69
+ parameters: {
70
+ type: "object",
71
+ properties: {
72
+ selector: { type: "string", description: "CSS selector" },
73
+ timeout: { type: "integer", description: "Timeout ms", default: 1e4 }
74
+ },
75
+ required: ["selector"]
76
+ }
77
+ }
78
+ },
79
+ {
80
+ type: "function",
81
+ function: {
82
+ name: "take_screenshot",
83
+ description: "Take page screenshot",
84
+ parameters: {
85
+ type: "object",
86
+ properties: {
87
+ full_page: { type: "boolean", description: "Full page capture", default: true }
88
+ }
89
+ }
90
+ }
91
+ },
92
+ {
93
+ type: "function",
94
+ function: {
95
+ name: "execute_python_code",
96
+ description: "Execute Python code. Use !command for bash (e.g., !pip install pandas)",
97
+ parameters: {
98
+ type: "object",
99
+ properties: { code: { type: "string", description: "Python/bash code to execute" } },
100
+ required: ["code"]
101
+ }
102
+ }
103
+ },
104
+ {
105
+ type: "function",
106
+ function: {
107
+ name: "scroll_page",
108
+ description: "Scroll page",
109
+ parameters: {
110
+ type: "object",
111
+ properties: {
112
+ x: { type: "integer", default: 0 },
113
+ y: { type: "integer", default: 500 }
114
+ }
115
+ }
116
+ }
117
+ },
118
+ {
119
+ type: "function",
120
+ function: {
121
+ name: "wait_for_element",
122
+ description: "Wait for element to appear",
123
+ parameters: {
124
+ type: "object",
125
+ properties: {
126
+ selector: { type: "string", description: "CSS selector" },
127
+ timeout: { type: "integer", default: 1e4 }
128
+ },
129
+ required: ["selector"]
130
+ }
131
+ }
132
+ }
133
+ ];
134
+ function serializeExecution(result) {
135
+ return {
136
+ stdout: result.stdout,
137
+ stderr: result.stderr,
138
+ success: result.success,
139
+ executionTime: result.executionTime,
140
+ cpuTime: result.cpuTime,
141
+ sessionId: result.sessionId,
142
+ error: result.error
143
+ };
144
+ }
145
+ function parseArgs(raw) {
146
+ if (!raw || !raw.trim()) return {};
147
+ try {
148
+ const v = JSON.parse(raw);
149
+ return v && typeof v === "object" && !Array.isArray(v) ? v : {};
150
+ } catch {
151
+ return {};
152
+ }
153
+ }
154
+ async function executeInstavmToolCall(instavm, toolCall, browserSession) {
155
+ const functionName = toolCall.function.name;
156
+ const arguments_ = parseArgs(toolCall.function.arguments);
157
+ try {
158
+ if (functionName === "create_browser_session") {
159
+ const width = Number(arguments_.width ?? 1920);
160
+ const height = Number(arguments_.height ?? 1080);
161
+ const session = await instavm.browser.createSession({ viewportWidth: width, viewportHeight: height });
162
+ return {
163
+ success: true,
164
+ session_id: session.sessionId,
165
+ session,
166
+ message: `Created browser session ${session.sessionId}`
167
+ };
168
+ }
169
+ if (functionName === "navigate_to_url") {
170
+ if (!browserSession) {
171
+ return { success: false, error: "No browser session. Create one first." };
172
+ }
173
+ const url = String(arguments_.url ?? "");
174
+ const result = await browserSession.navigate(url);
175
+ return { success: true, message: `Navigated to ${url}`, result };
176
+ }
177
+ if (functionName === "extract_page_content") {
178
+ if (!browserSession) {
179
+ return { success: false, error: "No browser session active" };
180
+ }
181
+ const selector = String(arguments_.selector ?? "body");
182
+ const maxLength = Number(arguments_.max_length ?? 1e4);
183
+ const elements = await browserSession.extractElements(selector, ["text"]);
184
+ if (elements?.length) {
185
+ const first = elements[0];
186
+ const text = String(first.text ?? first.content ?? "").slice(0, maxLength);
187
+ return { success: true, content: text, length: text.length };
188
+ }
189
+ return { success: false, error: "No content found" };
190
+ }
191
+ if (functionName === "extract_elements") {
192
+ if (!browserSession) {
193
+ return { success: false, error: "No browser session active" };
194
+ }
195
+ const selector = String(arguments_.selector ?? "");
196
+ const attributes = arguments_.attributes ?? ["text"];
197
+ const maxResults = Number(arguments_.max_results ?? 10);
198
+ const elements = await browserSession.extractElements(selector, attributes);
199
+ const list = Array.isArray(elements) ? elements : [];
200
+ return { success: true, elements: list.slice(0, maxResults), count: list.length };
201
+ }
202
+ if (functionName === "click_element") {
203
+ if (!browserSession) {
204
+ return { success: false, error: "No browser session active" };
205
+ }
206
+ const selector = String(arguments_.selector ?? "");
207
+ const timeout = Number(arguments_.timeout ?? 1e4);
208
+ await browserSession.click(selector, { timeout });
209
+ return { success: true, message: `Clicked ${selector}` };
210
+ }
211
+ if (functionName === "take_screenshot") {
212
+ if (!browserSession) {
213
+ return { success: false, error: "No browser session active" };
214
+ }
215
+ const fullPage = arguments_.full_page !== false;
216
+ const screenshot = await browserSession.screenshot({ fullPage });
217
+ return { success: true, screenshot_length: screenshot.length, screenshot };
218
+ }
219
+ if (functionName === "execute_python_code") {
220
+ const code = String(arguments_.code ?? "");
221
+ const result = await instavm.execute(code, { language: "python" });
222
+ return { success: true, output: serializeExecution(result) };
223
+ }
224
+ if (functionName === "scroll_page") {
225
+ if (!browserSession) {
226
+ return { success: false, error: "No browser session active" };
227
+ }
228
+ const x = Number(arguments_.x ?? 0);
229
+ const y = Number(arguments_.y ?? 500);
230
+ await browserSession.scroll({ x, y });
231
+ return { success: true, message: `Scrolled to (${x}, ${y})` };
232
+ }
233
+ if (functionName === "wait_for_element") {
234
+ if (!browserSession) {
235
+ return { success: false, error: "No browser session active" };
236
+ }
237
+ const selector = String(arguments_.selector ?? "");
238
+ const timeout = Number(arguments_.timeout ?? 1e4);
239
+ const result = await browserSession.waitFor("visible", selector, timeout);
240
+ return { success: true, message: `Element ${selector} visible`, result };
241
+ }
242
+ return { success: false, error: `Unknown function: ${functionName}` };
243
+ } catch (e) {
244
+ const msg = e instanceof Error ? e.message : String(e);
245
+ return { success: false, error: `Function ${functionName} failed: ${msg}` };
246
+ }
247
+ }
248
+ var INSTAVM_OLLAMA_TOOLS = INSTAVM_OPENAI_TOOLS.filter(
249
+ (t) => ["create_browser_session", "navigate_to_url", "extract_page_content", "extract_elements", "execute_python_code", "take_screenshot"].includes(
250
+ t.function.name
251
+ )
252
+ );
253
+ async function executeOllamaStyleTool(instavm, functionName, arguments_, browserSession) {
254
+ return executeInstavmToolCall(
255
+ instavm,
256
+ { function: { name: functionName, arguments: JSON.stringify(arguments_ || {}) } },
257
+ browserSession
258
+ );
259
+ }
260
+
261
+ // src/integrations/ollama/index.ts
262
+ function getOllamaTools() {
263
+ return INSTAVM_OLLAMA_TOOLS;
264
+ }
265
+ var get_ollama_tools = getOllamaTools;
266
+ async function executeOllamaTool(instavm, functionName, arguments_, browserSession) {
267
+ return executeOllamaStyleTool(instavm, functionName, arguments_, browserSession);
268
+ }
269
+ var DEFAULT_SYSTEM = `You are a web automation assistant with access to browser and code execution tools.
270
+ Be systematic and help the user accomplish their web automation tasks.`;
271
+ var OllamaAgent = class {
272
+ constructor(instavm, ollamaBaseUrl = "http://localhost:11434", model = "llama2", preferFunctionCalling = true) {
273
+ this.instavm = instavm;
274
+ this.ollamaBaseUrl = ollamaBaseUrl;
275
+ this.model = model;
276
+ this.preferFunctionCalling = preferFunctionCalling;
277
+ this.browserSession = null;
278
+ }
279
+ async chat(message, systemPrompt, useFunctionCalling = true) {
280
+ const system = systemPrompt ?? DEFAULT_SYSTEM;
281
+ try {
282
+ if (useFunctionCalling && this.preferFunctionCalling) {
283
+ return await this.chatWithFunctionCalling(message, system);
284
+ }
285
+ return await this.chatPlain(message, system);
286
+ } catch (e) {
287
+ const msg = e instanceof Error ? e.message : String(e);
288
+ if (useFunctionCalling && this.preferFunctionCalling) {
289
+ try {
290
+ return await this.chatPlain(message, system);
291
+ } catch (e2) {
292
+ return { error: `Ollama chat failed: ${e2 instanceof Error ? e2.message : String(e2)}` };
293
+ }
294
+ }
295
+ return { error: `Ollama chat failed: ${msg}` };
296
+ }
297
+ }
298
+ async chatPlain(message, system) {
299
+ const url = `${this.ollamaBaseUrl.replace(/\/$/, "")}/api/chat`;
300
+ const res = await fetch(url, {
301
+ method: "POST",
302
+ headers: { "Content-Type": "application/json" },
303
+ body: JSON.stringify({
304
+ model: this.model,
305
+ messages: [
306
+ { role: "system", content: system },
307
+ { role: "user", content: message }
308
+ ],
309
+ stream: false
310
+ })
311
+ });
312
+ if (!res.ok) {
313
+ return { error: `Ollama HTTP ${res.status}: ${await res.text()}` };
314
+ }
315
+ const data = await res.json();
316
+ const content = data.message?.content ?? "";
317
+ return { response: typeof content === "string" ? content : JSON.stringify(content) };
318
+ }
319
+ async chatWithFunctionCalling(message, system) {
320
+ const url = `${this.ollamaBaseUrl.replace(/\/$/, "")}/api/chat`;
321
+ const tools = getOllamaTools();
322
+ const res = await fetch(url, {
323
+ method: "POST",
324
+ headers: { "Content-Type": "application/json" },
325
+ body: JSON.stringify({
326
+ model: this.model,
327
+ messages: [
328
+ { role: "system", content: system },
329
+ { role: "user", content: message }
330
+ ],
331
+ tools,
332
+ stream: false
333
+ })
334
+ });
335
+ if (!res.ok) {
336
+ return { error: `Ollama HTTP ${res.status}: ${await res.text()}` };
337
+ }
338
+ const data = await res.json();
339
+ const ollamaMessage = data.message;
340
+ const toolCalls = ollamaMessage?.tool_calls;
341
+ if (toolCalls?.length) {
342
+ const toolCall = toolCalls[0];
343
+ const functionName = toolCall.function.name;
344
+ let arguments_ = {};
345
+ try {
346
+ arguments_ = JSON.parse(toolCall.function.arguments || "{}");
347
+ } catch {
348
+ arguments_ = {};
349
+ }
350
+ const toolResult = await executeOllamaTool(this.instavm, functionName, arguments_, this.browserSession);
351
+ if (toolResult.session) {
352
+ this.browserSession = toolResult.session;
353
+ }
354
+ const follow = await fetch(url, {
355
+ method: "POST",
356
+ headers: { "Content-Type": "application/json" },
357
+ body: JSON.stringify({
358
+ model: this.model,
359
+ messages: [
360
+ { role: "system", content: system },
361
+ { role: "user", content: message },
362
+ {
363
+ role: "assistant",
364
+ content: ollamaMessage?.content ?? "",
365
+ tool_calls: toolCalls
366
+ },
367
+ { role: "tool", content: JSON.stringify(toolResult), name: functionName }
368
+ ],
369
+ tools,
370
+ stream: false
371
+ })
372
+ });
373
+ if (follow.ok) {
374
+ const final = await follow.json();
375
+ return {
376
+ response: final.message?.content ?? "",
377
+ tool_used: functionName,
378
+ tool_result: toolResult
379
+ };
380
+ }
381
+ }
382
+ return { response: ollamaMessage?.content ?? JSON.stringify(ollamaMessage ?? {}) };
383
+ }
384
+ };
385
+ export {
386
+ OllamaAgent,
387
+ executeOllamaTool,
388
+ getOllamaTools,
389
+ get_ollama_tools
390
+ };
391
+ //# sourceMappingURL=ollama.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/integrations/_instavmToolsCore.ts","../../src/integrations/ollama/index.ts"],"sourcesContent":["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","import type { InstaVM } from '../../client/InstaVM';\nimport type { BrowserSession } from '../../client/BrowserSession';\nimport {\n INSTAVM_OLLAMA_TOOLS,\n executeOllamaStyleTool,\n type InstaVMOpenAITool,\n} from '../_instavmToolsCore';\n\nexport type { InstaVMOpenAITool };\n\n/** Tool definitions for Ollama `/api/chat` (subset matching Python `get_ollama_tools`). */\nexport function getOllamaTools(): InstaVMOpenAITool[] {\n return INSTAVM_OLLAMA_TOOLS;\n}\n\nexport const get_ollama_tools = getOllamaTools;\n\n/** Execute one Ollama tool by name (Python `execute_ollama_tool`). */\nexport async function executeOllamaTool(\n instavm: InstaVM,\n functionName: string,\n arguments_: Record<string, unknown>,\n browserSession?: BrowserSession | null,\n) {\n return executeOllamaStyleTool(instavm, functionName, arguments_, browserSession);\n}\n\nconst DEFAULT_SYSTEM = `You are a web automation assistant with access to browser and code execution tools.\nBe systematic and help the user accomplish their web automation tasks.`;\n\nexport type OllamaChatResult =\n | { response: string; tool_used?: string; tool_result?: Record<string, unknown> }\n | { error: string };\n\n/**\n * Minimal Ollama + InstaVM agent using HTTP `/api/chat` (no required `ollama` npm package).\n */\nexport class OllamaAgent {\n private browserSession: BrowserSession | null = null;\n\n constructor(\n private readonly instavm: InstaVM,\n private readonly ollamaBaseUrl: string = 'http://localhost:11434',\n private readonly model: string = 'llama2',\n private readonly preferFunctionCalling: boolean = true,\n ) {}\n\n async chat(\n message: string,\n systemPrompt?: string,\n useFunctionCalling: boolean = true,\n ): Promise<OllamaChatResult> {\n const system = systemPrompt ?? DEFAULT_SYSTEM;\n try {\n if (useFunctionCalling && this.preferFunctionCalling) {\n return await this.chatWithFunctionCalling(message, system);\n }\n return await this.chatPlain(message, system);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (useFunctionCalling && this.preferFunctionCalling) {\n try {\n return await this.chatPlain(message, system);\n } catch (e2) {\n return { error: `Ollama chat failed: ${e2 instanceof Error ? e2.message : String(e2)}` };\n }\n }\n return { error: `Ollama chat failed: ${msg}` };\n }\n }\n\n private async chatPlain(message: string, system: string): Promise<OllamaChatResult> {\n const url = `${this.ollamaBaseUrl.replace(/\\/$/, '')}/api/chat`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.model,\n messages: [\n { role: 'system', content: system },\n { role: 'user', content: message },\n ],\n stream: false,\n }),\n });\n if (!res.ok) {\n return { error: `Ollama HTTP ${res.status}: ${await res.text()}` };\n }\n const data = (await res.json()) as { message?: { content?: string } };\n const content = data.message?.content ?? '';\n return { response: typeof content === 'string' ? content : JSON.stringify(content) };\n }\n\n private async chatWithFunctionCalling(message: string, system: string): Promise<OllamaChatResult> {\n const url = `${this.ollamaBaseUrl.replace(/\\/$/, '')}/api/chat`;\n const tools = getOllamaTools();\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.model,\n messages: [\n { role: 'system', content: system },\n { role: 'user', content: message },\n ],\n tools,\n stream: false,\n }),\n });\n if (!res.ok) {\n return { error: `Ollama HTTP ${res.status}: ${await res.text()}` };\n }\n\n const data = (await res.json()) as {\n message?: { content?: string; tool_calls?: Array<{ function: { name: string; arguments: string } }> };\n };\n const ollamaMessage = data.message;\n const toolCalls = ollamaMessage?.tool_calls;\n if (toolCalls?.length) {\n const toolCall = toolCalls[0];\n const functionName = toolCall.function.name;\n let arguments_: Record<string, unknown> = {};\n try {\n arguments_ = JSON.parse(toolCall.function.arguments || '{}') as Record<string, unknown>;\n } catch {\n arguments_ = {};\n }\n\n const toolResult = await executeOllamaTool(this.instavm, functionName, arguments_, this.browserSession);\n if (toolResult.session) {\n this.browserSession = toolResult.session;\n }\n\n const follow = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.model,\n messages: [\n { role: 'system', content: system },\n { role: 'user', content: message },\n {\n role: 'assistant',\n content: ollamaMessage?.content ?? '',\n tool_calls: toolCalls,\n },\n { role: 'tool', content: JSON.stringify(toolResult), name: functionName },\n ],\n tools,\n stream: false,\n }),\n });\n\n if (follow.ok) {\n const final = (await follow.json()) as { message?: { content?: string } };\n return {\n response: final.message?.content ?? '',\n tool_used: functionName,\n tool_result: toolResult as Record<string, unknown>,\n };\n }\n }\n\n return { response: ollamaMessage?.content ?? JSON.stringify(ollamaMessage ?? {}) };\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,19 @@
1
+ import { I as InstaVM, b as BrowserSession } from '../InstaVM-DjkmUcaP.mjs';
2
+ import { I as InstaVMOpenAITool, T as ToolCallLike, e as executeInstavmToolCall } from '../_instavmToolsCore-34H4iqVZ.mjs';
3
+ import 'form-data';
4
+ import 'eventemitter3';
5
+
6
+ /** @deprecated Use `InstaVMOpenAITool` */
7
+ type OpenAITool = InstaVMOpenAITool;
8
+ /** Alias matching Python `get_tools`. */
9
+ declare function getTools(): InstaVMOpenAITool[];
10
+ /** Plan / README name for OpenAI-compatible tool definitions. */
11
+ declare const getOpenAITools: typeof getTools;
12
+ /**
13
+ * Execute one chat tool call (Python `execute_tool`).
14
+ * If the result includes `session`, assign it to your active browser session for subsequent calls.
15
+ */
16
+ declare function executeTool(instavm: InstaVM, toolCall: ToolCallLike, browserSession?: BrowserSession | null): ReturnType<typeof executeInstavmToolCall>;
17
+ declare const executeToolCall: typeof executeTool;
18
+
19
+ export { InstaVMOpenAITool, type OpenAITool, executeTool, executeToolCall, getOpenAITools, getTools };
@@ -0,0 +1,19 @@
1
+ import { I as InstaVM, b as BrowserSession } from '../InstaVM-DjkmUcaP.js';
2
+ import { I as InstaVMOpenAITool, T as ToolCallLike, e as executeInstavmToolCall } from '../_instavmToolsCore-BuaJyxXB.js';
3
+ import 'form-data';
4
+ import 'eventemitter3';
5
+
6
+ /** @deprecated Use `InstaVMOpenAITool` */
7
+ type OpenAITool = InstaVMOpenAITool;
8
+ /** Alias matching Python `get_tools`. */
9
+ declare function getTools(): InstaVMOpenAITool[];
10
+ /** Plan / README name for OpenAI-compatible tool definitions. */
11
+ declare const getOpenAITools: typeof getTools;
12
+ /**
13
+ * Execute one chat tool call (Python `execute_tool`).
14
+ * If the result includes `session`, assign it to your active browser session for subsequent calls.
15
+ */
16
+ declare function executeTool(instavm: InstaVM, toolCall: ToolCallLike, browserSession?: BrowserSession | null): ReturnType<typeof executeInstavmToolCall>;
17
+ declare const executeToolCall: typeof executeTool;
18
+
19
+ export { InstaVMOpenAITool, type OpenAITool, executeTool, executeToolCall, getOpenAITools, getTools };