zilmate 1.7.2 → 1.7.6

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 (228) hide show
  1. package/.env.example +36 -36
  2. package/README.md +503 -503
  3. package/SDK.md +320 -320
  4. package/agent-docs.md +276 -276
  5. package/dist/agents/automation-planner.agent.d.ts.map +1 -1
  6. package/dist/agents/coding.agent.d.ts +18 -0
  7. package/dist/agents/coding.agent.d.ts.map +1 -1
  8. package/dist/agents/finance.agent.d.ts +60 -0
  9. package/dist/agents/finance.agent.d.ts.map +1 -0
  10. package/dist/agents/finance.agent.js +30 -0
  11. package/dist/agents/finance.agent.js.map +1 -0
  12. package/dist/agents/manager.d.ts +94 -1
  13. package/dist/agents/manager.d.ts.map +1 -1
  14. package/dist/agents/manager.js +102 -36
  15. package/dist/agents/manager.js.map +1 -1
  16. package/dist/agents/swarm/engineering/qa.d.ts +3 -0
  17. package/dist/agents/swarm/engineering/qa.d.ts.map +1 -0
  18. package/dist/agents/swarm/engineering/qa.js +19 -0
  19. package/dist/agents/swarm/engineering/qa.js.map +1 -0
  20. package/dist/agents/swarm/growth/seo.d.ts +3 -0
  21. package/dist/agents/swarm/growth/seo.d.ts.map +1 -0
  22. package/dist/agents/swarm/growth/seo.js +19 -0
  23. package/dist/agents/swarm/growth/seo.js.map +1 -0
  24. package/dist/agents/swarm/main.d.ts +22 -0
  25. package/dist/agents/swarm/main.d.ts.map +1 -0
  26. package/dist/agents/swarm/main.js +65 -0
  27. package/dist/agents/swarm/main.js.map +1 -0
  28. package/dist/agents/swarm/operations/finance.d.ts +3 -0
  29. package/dist/agents/swarm/operations/finance.d.ts.map +1 -0
  30. package/dist/agents/swarm/operations/finance.js +19 -0
  31. package/dist/agents/swarm/operations/finance.js.map +1 -0
  32. package/dist/agents/swarm/registry.d.ts +4 -0
  33. package/dist/agents/swarm/registry.d.ts.map +1 -0
  34. package/dist/agents/swarm/registry.js +361 -0
  35. package/dist/agents/swarm/registry.js.map +1 -0
  36. package/dist/cli/chat.d.ts +2 -0
  37. package/dist/cli/chat.d.ts.map +1 -0
  38. package/dist/cli/chat.js +61 -0
  39. package/dist/cli/chat.js.map +1 -0
  40. package/dist/cli/composer.d.ts.map +1 -1
  41. package/dist/cli/composer.js +54 -4
  42. package/dist/cli/composer.js.map +1 -1
  43. package/dist/cli/doctor.d.ts.map +1 -1
  44. package/dist/cli/doctor.js +13 -0
  45. package/dist/cli/doctor.js.map +1 -1
  46. package/dist/cli/format.d.ts.map +1 -1
  47. package/dist/cli/format.js +46 -53
  48. package/dist/cli/format.js.map +1 -1
  49. package/dist/cli/interactive.d.ts.map +1 -1
  50. package/dist/cli/interactive.js +51 -6
  51. package/dist/cli/interactive.js.map +1 -1
  52. package/dist/cli/models.d.ts +1 -1
  53. package/dist/cli/models.d.ts.map +1 -1
  54. package/dist/cli/models.js +21 -21
  55. package/dist/cli/models.js.map +1 -1
  56. package/dist/cli/prompt.d.ts +2 -2
  57. package/dist/cli/prompt.d.ts.map +1 -1
  58. package/dist/cli/prompt.js +58 -14
  59. package/dist/cli/prompt.js.map +1 -1
  60. package/dist/cli/render.d.ts.map +1 -1
  61. package/dist/cli/render.js +25 -17
  62. package/dist/cli/render.js.map +1 -1
  63. package/dist/cli/setup.d.ts +1 -0
  64. package/dist/cli/setup.d.ts.map +1 -1
  65. package/dist/cli/setup.js +74 -2
  66. package/dist/cli/setup.js.map +1 -1
  67. package/dist/cli/swarm.d.ts +4 -0
  68. package/dist/cli/swarm.d.ts.map +1 -0
  69. package/dist/cli/swarm.js +21 -0
  70. package/dist/cli/swarm.js.map +1 -0
  71. package/dist/cli/theme.d.ts +67 -1
  72. package/dist/cli/theme.d.ts.map +1 -1
  73. package/dist/cli/theme.js +66 -4
  74. package/dist/cli/theme.js.map +1 -1
  75. package/dist/cli/tunnel.d.ts.map +1 -1
  76. package/dist/cli/tunnel.js +2 -1
  77. package/dist/cli/tunnel.js.map +1 -1
  78. package/dist/cli/voice.js +11 -11
  79. package/dist/cli/welcome.d.ts.map +1 -1
  80. package/dist/cli/welcome.js +2 -0
  81. package/dist/cli/welcome.js.map +1 -1
  82. package/dist/config/model-store.d.ts +1 -1
  83. package/dist/config/model-store.d.ts.map +1 -1
  84. package/dist/config/model-store.js +14 -1
  85. package/dist/config/model-store.js.map +1 -1
  86. package/dist/config/models.d.ts +7 -0
  87. package/dist/config/models.d.ts.map +1 -1
  88. package/dist/config/models.js +30 -6
  89. package/dist/config/models.js.map +1 -1
  90. package/dist/documents/pdf.d.ts.map +1 -1
  91. package/dist/documents/pdf.js +143 -41
  92. package/dist/documents/pdf.js.map +1 -1
  93. package/dist/index.js +19 -1
  94. package/dist/index.js.map +1 -1
  95. package/dist/jobs/anomaly.js +5 -5
  96. package/dist/memory/heal.js +43 -43
  97. package/dist/observability/doctor.d.ts +3 -0
  98. package/dist/observability/doctor.d.ts.map +1 -0
  99. package/dist/observability/doctor.js +33 -0
  100. package/dist/observability/doctor.js.map +1 -0
  101. package/dist/observability/usage.d.ts +13 -0
  102. package/dist/observability/usage.d.ts.map +1 -0
  103. package/dist/observability/usage.js +34 -0
  104. package/dist/observability/usage.js.map +1 -0
  105. package/dist/runtime/chat-bridge.d.ts +32 -0
  106. package/dist/runtime/chat-bridge.d.ts.map +1 -0
  107. package/dist/runtime/chat-bridge.js +92 -0
  108. package/dist/runtime/chat-bridge.js.map +1 -0
  109. package/dist/runtime/confirm.d.ts.map +1 -1
  110. package/dist/runtime/confirm.js +12 -2
  111. package/dist/runtime/confirm.js.map +1 -1
  112. package/dist/runtime/progress.d.ts.map +1 -1
  113. package/dist/runtime/progress.js +3 -1
  114. package/dist/runtime/progress.js.map +1 -1
  115. package/dist/runtime/prompts/builder.d.ts +11 -0
  116. package/dist/runtime/prompts/builder.d.ts.map +1 -0
  117. package/dist/runtime/prompts/builder.js +29 -0
  118. package/dist/runtime/prompts/builder.js.map +1 -0
  119. package/dist/runtime/registry.d.ts +14 -0
  120. package/dist/runtime/registry.d.ts.map +1 -0
  121. package/dist/runtime/registry.js +39 -0
  122. package/dist/runtime/registry.js.map +1 -0
  123. package/dist/runtime/storage/interface.d.ts +16 -0
  124. package/dist/runtime/storage/interface.d.ts.map +1 -0
  125. package/dist/runtime/storage/interface.js +19 -0
  126. package/dist/runtime/storage/interface.js.map +1 -0
  127. package/dist/runtime/storage/local.d.ts +12 -0
  128. package/dist/runtime/storage/local.d.ts.map +1 -0
  129. package/dist/runtime/storage/local.js +48 -0
  130. package/dist/runtime/storage/local.js.map +1 -0
  131. package/dist/runtime/storage/redis.d.ts +11 -0
  132. package/dist/runtime/storage/redis.d.ts.map +1 -0
  133. package/dist/runtime/storage/redis.js +21 -0
  134. package/dist/runtime/storage/redis.js.map +1 -0
  135. package/dist/runtime/swarm/reports.d.ts +9 -0
  136. package/dist/runtime/swarm/reports.d.ts.map +1 -0
  137. package/dist/runtime/swarm/reports.js +43 -0
  138. package/dist/runtime/swarm/reports.js.map +1 -0
  139. package/dist/runtime/swarm.d.ts +38 -0
  140. package/dist/runtime/swarm.d.ts.map +1 -0
  141. package/dist/runtime/swarm.js +110 -0
  142. package/dist/runtime/swarm.js.map +1 -0
  143. package/dist/runtime/telemetry.d.ts +15 -0
  144. package/dist/runtime/telemetry.d.ts.map +1 -0
  145. package/dist/runtime/telemetry.js +25 -0
  146. package/dist/runtime/telemetry.js.map +1 -0
  147. package/dist/runtime/tool-utils.d.ts +12 -0
  148. package/dist/runtime/tool-utils.d.ts.map +1 -0
  149. package/dist/runtime/tool-utils.js +31 -0
  150. package/dist/runtime/tool-utils.js.map +1 -0
  151. package/dist/tools/browser.tool.d.ts +54 -0
  152. package/dist/tools/browser.tool.d.ts.map +1 -0
  153. package/dist/tools/browser.tool.js +193 -0
  154. package/dist/tools/browser.tool.js.map +1 -0
  155. package/dist/tools/business-apps.tool.d.ts +18 -0
  156. package/dist/tools/business-apps.tool.d.ts.map +1 -0
  157. package/dist/tools/business-apps.tool.js +43 -0
  158. package/dist/tools/business-apps.tool.js.map +1 -0
  159. package/dist/tools/computer-use.tool.js +66 -66
  160. package/dist/tools/cross-app-ledger.tool.d.ts +7 -0
  161. package/dist/tools/cross-app-ledger.tool.d.ts.map +1 -0
  162. package/dist/tools/cross-app-ledger.tool.js +70 -0
  163. package/dist/tools/cross-app-ledger.tool.js.map +1 -0
  164. package/dist/tools/daytona-browser.tool.d.ts +113 -0
  165. package/dist/tools/daytona-browser.tool.d.ts.map +1 -0
  166. package/dist/tools/daytona-browser.tool.js +348 -0
  167. package/dist/tools/daytona-browser.tool.js.map +1 -0
  168. package/dist/tools/desktop.tool.js +10 -10
  169. package/dist/tools/documents.tool.js +5 -5
  170. package/dist/tools/finance.tool.d.ts +18 -0
  171. package/dist/tools/finance.tool.d.ts.map +1 -0
  172. package/dist/tools/finance.tool.js +88 -0
  173. package/dist/tools/finance.tool.js.map +1 -0
  174. package/dist/tools/image-intelligence.tool.d.ts +12 -0
  175. package/dist/tools/image-intelligence.tool.d.ts.map +1 -0
  176. package/dist/tools/image-intelligence.tool.js +62 -0
  177. package/dist/tools/image-intelligence.tool.js.map +1 -0
  178. package/dist/tools/notify.tool.js +8 -8
  179. package/dist/tools/osint-install.tool.js +8 -8
  180. package/dist/tools/pentest-install.tool.js +6 -6
  181. package/dist/tools/setup-assistant.tool.d.ts +1 -1
  182. package/dist/tools/shell.tool.d.ts +18 -0
  183. package/dist/tools/shell.tool.d.ts.map +1 -1
  184. package/dist/tools/shell.tool.js +34 -0
  185. package/dist/tools/shell.tool.js.map +1 -1
  186. package/dist/tools/swarm-collaboration.tool.d.ts +29 -0
  187. package/dist/tools/swarm-collaboration.tool.d.ts.map +1 -0
  188. package/dist/tools/swarm-collaboration.tool.js +88 -0
  189. package/dist/tools/swarm-collaboration.tool.js.map +1 -0
  190. package/dist/tools/swarm-memory.tool.d.ts +16 -0
  191. package/dist/tools/swarm-memory.tool.d.ts.map +1 -0
  192. package/dist/tools/swarm-memory.tool.js +31 -0
  193. package/dist/tools/swarm-memory.tool.js.map +1 -0
  194. package/dist/tools/swarm-ops.tool.d.ts +20 -0
  195. package/dist/tools/swarm-ops.tool.d.ts.map +1 -0
  196. package/dist/tools/swarm-ops.tool.js +55 -0
  197. package/dist/tools/swarm-ops.tool.js.map +1 -0
  198. package/dist/tools/triggers.tool.d.ts.map +1 -1
  199. package/dist/tools/visual-audit.tool.d.ts +24 -0
  200. package/dist/tools/visual-audit.tool.d.ts.map +1 -0
  201. package/dist/tools/visual-audit.tool.js +48 -0
  202. package/dist/tools/visual-audit.tool.js.map +1 -0
  203. package/dist/tools/web-intelligence.tool.d.ts +12 -0
  204. package/dist/tools/web-intelligence.tool.d.ts.map +1 -0
  205. package/dist/tools/web-intelligence.tool.js +27 -0
  206. package/dist/tools/web-intelligence.tool.js.map +1 -0
  207. package/dist/workspace/init.js +18 -18
  208. package/dist/workspace/output-paths.d.ts +1 -1
  209. package/dist/workspace/output-paths.d.ts.map +1 -1
  210. package/dist/workspace/output-paths.js +1 -0
  211. package/dist/workspace/output-paths.js.map +1 -1
  212. package/dist/workspace/paths.d.ts +1 -0
  213. package/dist/workspace/paths.d.ts.map +1 -1
  214. package/dist/workspace/paths.js +1 -0
  215. package/dist/workspace/paths.js.map +1 -1
  216. package/install.ps1 +62 -62
  217. package/package.json +107 -103
  218. package/scripts/postinstall.mjs +42 -42
  219. package/scripts/release-github.mjs +91 -91
  220. package/src/doc/README.md +49 -49
  221. package/src/doc/admin-tools-and-sms-campaigns.md +99 -99
  222. package/src/doc/escalation-checklist.md +97 -97
  223. package/src/doc/payments-and-payouts.md +82 -82
  224. package/src/doc/shift-lifecycle-and-disputes.md +95 -95
  225. package/src/doc/support-macros.md +40 -40
  226. package/src/doc/venue-support-playbook.md +145 -145
  227. package/src/doc/verification-and-trust.md +88 -88
  228. package/src/doc/worker-support-playbook.md +159 -159
@@ -0,0 +1,348 @@
1
+ import { tool } from 'ai';
2
+ import { z } from 'zod';
3
+ import { Daytona } from '@daytonaio/sdk';
4
+ import { mkdir, writeFile } from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ import { requestConfirmation } from '../runtime/confirm.js';
7
+ import { emitProgress } from '../runtime/progress.js';
8
+ /**
9
+ * Daytona Browser-Use Tool
10
+ *
11
+ * Runs real Playwright browser automation INSIDE an isolated Daytona sandbox —
12
+ * not on your local machine. This means:
13
+ * - Login sessions, cookies, and downloaded files never touch your laptop
14
+ * - You can run untrusted/scraping-heavy workloads with zero blast radius
15
+ * - Sandboxes are full Linux VMs — Chromium runs headless inside them
16
+ * - Daytona's `computerUse` API additionally gives mouse/keyboard/screenshot
17
+ * control of the sandbox's own desktop, useful for non-headless flows
18
+ *
19
+ * Architecture:
20
+ * 1. getOrCreateBrowserSandbox — reuses one warm sandbox across calls (fast),
21
+ * or spins up a fresh ephemeral one for isolated one-off tasks.
22
+ * 2. browserNavigate / browserAction / browserExtract / browserScreenshot —
23
+ * each one runs a small Playwright script via sandbox.process.codeRun()
24
+ * and returns structured results.
25
+ * 3. closeBrowserSandbox — tears down the sandbox when done (saves cost).
26
+ *
27
+ * Requires DAYTONA_API_KEY in env. Get one free at app.daytona.io.
28
+ */
29
+ let daytonaClient = null;
30
+ let warmSandbox = null;
31
+ let warmSandboxId = null;
32
+ const outputDir = path.resolve('outputs', 'daytona-browser');
33
+ async function ensureOutputDir() {
34
+ await mkdir(outputDir, { recursive: true });
35
+ return outputDir;
36
+ }
37
+ function ts() {
38
+ return new Date().toISOString().replace(/[:.]/g, '-');
39
+ }
40
+ function getClient() {
41
+ if (!daytonaClient) {
42
+ if (!process.env.DAYTONA_API_KEY) {
43
+ throw new Error('DAYTONA_API_KEY is not set. Get a free key at https://app.daytona.io and add it to your .env.');
44
+ }
45
+ daytonaClient = new Daytona({ apiKey: process.env.DAYTONA_API_KEY });
46
+ }
47
+ return daytonaClient;
48
+ }
49
+ async function confirmBrowserAction(action, details) {
50
+ return requestConfirmation({
51
+ toolkitSlug: 'ZILMATE',
52
+ toolSlug: 'DAYTONA_BROWSER',
53
+ action,
54
+ access: 'Read-only',
55
+ targetTools: ['ZILMATE_DAYTONA_BROWSER'],
56
+ details,
57
+ summary: details.join('; '),
58
+ });
59
+ }
60
+ /**
61
+ * The Playwright bootstrap script every action builds on.
62
+ * Persists browser state across calls in the same sandbox via a JSON
63
+ * "session file" written to /tmp — the sandbox's process.codeRun is
64
+ * stateless between calls, so we re-launch and reattach to the same
65
+ * storage_state each time to keep cookies/login alive.
66
+ */
67
+ function playwrightScript(body, opts = {}) {
68
+ const headless = opts.headless ?? true;
69
+ const storagePath = opts.storageStatePath ?? '/tmp/zilmate-browser-state.json';
70
+ return `
71
+ import json, os, sys
72
+ from playwright.sync_api import sync_playwright
73
+
74
+ STORAGE_PATH = "${storagePath}"
75
+
76
+ with sync_playwright() as p:
77
+ browser = p.chromium.launch(headless=${headless ? 'True' : 'False'})
78
+ context_kwargs = {}
79
+ if os.path.exists(STORAGE_PATH):
80
+ context_kwargs["storage_state"] = STORAGE_PATH
81
+ context = browser.new_context(**context_kwargs, viewport={"width": 1440, "height": 900})
82
+ page = context.new_page()
83
+
84
+ result = {}
85
+ try:
86
+ ${body.split('\n').map((l) => ' ' + l).join('\n')}
87
+ finally:
88
+ # Persist cookies/session for next call
89
+ context.storage_state(path=STORAGE_PATH)
90
+ browser.close()
91
+
92
+ print("ZILMATE_RESULT_START")
93
+ print(json.dumps(result, default=str))
94
+ print("ZILMATE_RESULT_END")
95
+ `.trim();
96
+ }
97
+ function extractResult(output) {
98
+ const start = output.indexOf('ZILMATE_RESULT_START');
99
+ const end = output.indexOf('ZILMATE_RESULT_END');
100
+ if (start === -1 || end === -1) {
101
+ return { raw: output.slice(-2000) };
102
+ }
103
+ const jsonStr = output.slice(start + 'ZILMATE_RESULT_START'.length, end).trim();
104
+ try {
105
+ return JSON.parse(jsonStr);
106
+ }
107
+ catch {
108
+ return { raw: jsonStr };
109
+ }
110
+ }
111
+ // ─── Sandbox lifecycle ────────────────────────────────────────────────────────
112
+ export const sandboxLifecycleTools = {
113
+ getOrCreateBrowserSandbox: tool({
114
+ description: 'Create or reuse a warm Daytona sandbox with Playwright + Chromium installed, ready for browser automation. Call this once at the start of a browsing task. Reuses the same sandbox across calls in this session so login cookies persist, unless ephemeral=true.',
115
+ inputSchema: z.object({
116
+ ephemeral: z
117
+ .boolean()
118
+ .optional()
119
+ .default(false)
120
+ .describe('If true, always creates a fresh isolated sandbox (auto-deleted when stopped) instead of reusing the warm one. Use for untrusted/one-off scraping tasks.'),
121
+ }),
122
+ execute: async ({ ephemeral }) => {
123
+ const approved = await confirmBrowserAction('Create Daytona browser sandbox', [
124
+ ephemeral ? 'Ephemeral sandbox — auto-deleted after use' : 'Reusable sandbox — persists across calls this session',
125
+ 'Installs Playwright + Chromium inside an isolated cloud VM',
126
+ ]);
127
+ if (!approved)
128
+ throw new Error('Blocked sandbox creation. Ask user to approve.');
129
+ const daytona = getClient();
130
+ if (!ephemeral && warmSandbox && warmSandboxId) {
131
+ emitProgress({ type: 'tool:end', label: 'Reusing existing browser sandbox', detail: warmSandboxId });
132
+ return { sandboxId: warmSandboxId, reused: true };
133
+ }
134
+ emitProgress({ type: 'tool:start', label: 'Creating Daytona sandbox' });
135
+ const sandbox = ephemeral
136
+ ? await daytona.create({ ephemeral: true, autoStopInterval: 10 })
137
+ : await daytona.create();
138
+ emitProgress({ type: 'tool:start', label: 'Installing Playwright + Chromium', detail: sandbox.id });
139
+ // Install playwright and the chromium browser binary inside the sandbox
140
+ const install = await sandbox.process.executeCommand('pip install playwright >/tmp/pw-install.log 2>&1 && playwright install --with-deps chromium >>/tmp/pw-install.log 2>&1 && echo DONE', undefined, undefined, 180);
141
+ if (!install.result?.includes('DONE')) {
142
+ throw new Error(`Playwright install failed in sandbox: ${install.result?.slice(-500)}`);
143
+ }
144
+ if (!ephemeral) {
145
+ warmSandbox = sandbox;
146
+ warmSandboxId = sandbox.id;
147
+ }
148
+ emitProgress({ type: 'tool:end', label: 'Browser sandbox ready', detail: sandbox.id });
149
+ return { sandboxId: sandbox.id, reused: false, ephemeral };
150
+ },
151
+ }),
152
+ closeBrowserSandbox: tool({
153
+ description: 'Stop and release the warm browser sandbox to stop incurring compute cost. Call when a browsing task is fully done.',
154
+ inputSchema: z.object({}),
155
+ execute: async () => {
156
+ if (!warmSandbox) {
157
+ return { closed: false, message: 'No active browser sandbox to close.' };
158
+ }
159
+ const id = warmSandboxId;
160
+ emitProgress({ type: 'tool:start', label: 'Closing browser sandbox', ...(id ? { detail: id } : {}) });
161
+ await warmSandbox.stop();
162
+ warmSandbox = null;
163
+ warmSandboxId = null;
164
+ emitProgress({ type: 'tool:end', label: 'Browser sandbox closed' });
165
+ return { closed: true, sandboxId: id };
166
+ },
167
+ }),
168
+ };
169
+ // ─── Core browsing actions ───────────────────────────────────────────────────
170
+ function getActiveSandbox() {
171
+ if (!warmSandbox) {
172
+ throw new Error('No active browser sandbox. Call getOrCreateBrowserSandbox first.');
173
+ }
174
+ return warmSandbox;
175
+ }
176
+ export const browsingTools = {
177
+ browserNavigate: tool({
178
+ description: 'Navigate to a URL inside the sandboxed browser and return the page title, final URL (after redirects), and visible text content. The starting point for any browsing task.',
179
+ inputSchema: z.object({
180
+ url: z.string().url(),
181
+ waitForSelector: z.string().optional().describe('CSS selector to wait for before considering the page loaded (useful for SPAs).'),
182
+ timeoutMs: z.number().int().min(1000).max(60_000).optional().default(30_000),
183
+ }),
184
+ execute: async ({ url, waitForSelector, timeoutMs }) => {
185
+ const approved = await confirmBrowserAction('Navigate browser', [`URL: ${url}`]);
186
+ if (!approved)
187
+ throw new Error('Blocked navigation. Ask user to approve.');
188
+ const sandbox = getActiveSandbox();
189
+ emitProgress({ type: 'tool:start', label: 'Navigating', detail: url });
190
+ const body = `
191
+ page.goto("${url}", timeout=${timeoutMs})
192
+ ${waitForSelector ? `page.wait_for_selector("${waitForSelector}", timeout=${timeoutMs})` : ''}
193
+ result["title"] = page.title()
194
+ result["finalUrl"] = page.url
195
+ result["text"] = page.inner_text("body")[:5000]
196
+ `;
197
+ const out = await sandbox.process.codeRun(playwrightScript(body), undefined, Math.ceil(timeoutMs / 1000) + 15);
198
+ const parsed = extractResult(out.result ?? '');
199
+ emitProgress({ type: 'tool:end', label: 'Navigation complete', detail: parsed.finalUrl });
200
+ return parsed;
201
+ },
202
+ }),
203
+ browserAction: tool({
204
+ description: 'Perform an interaction on the current page inside the sandboxed browser: click, type into a field, select a dropdown option, check a checkbox, press a key, or wait for an element. Use CSS selectors or Playwright text= selectors.',
205
+ inputSchema: z.object({
206
+ action: z.enum(['click', 'fill', 'select', 'check', 'uncheck', 'press', 'waitFor', 'scroll']),
207
+ selector: z.string().describe('CSS selector or Playwright selector, e.g. "#submit", "text=Sign in", "[name=email]".'),
208
+ value: z.string().optional().describe('Text to fill, option value to select, or key to press (e.g. "Enter").'),
209
+ timeoutMs: z.number().int().min(500).max(30_000).optional().default(10_000),
210
+ }),
211
+ execute: async ({ action, selector, value, timeoutMs }) => {
212
+ const approved = await confirmBrowserAction('Browser interaction', [`${action} on "${selector}"`, value ? `Value: ${value}` : '']);
213
+ if (!approved)
214
+ throw new Error('Blocked browser action. Ask user to approve.');
215
+ const sandbox = getActiveSandbox();
216
+ emitProgress({ type: 'tool:start', label: `Browser ${action}`, detail: selector });
217
+ // NOTE: this requires the browser to have an existing page context.
218
+ // We re-navigate to the last known URL stored in storage_state's page,
219
+ // but Playwright doesn't persist "current page" — so actions must be
220
+ // chained with browserNavigate immediately before, or use browserRunScript
221
+ // for multi-step flows within a single browser session (see below).
222
+ const escapedValue = (value ?? '').replace(/"/g, '\\"');
223
+ const body = `
224
+ last_url = result.get("__last_url__")
225
+ ${action === 'click' ? `page.click("${selector}", timeout=${timeoutMs})` : ''}
226
+ ${action === 'fill' ? `page.fill("${selector}", "${escapedValue}", timeout=${timeoutMs})` : ''}
227
+ ${action === 'select' ? `page.select_option("${selector}", "${escapedValue}", timeout=${timeoutMs})` : ''}
228
+ ${action === 'check' ? `page.check("${selector}", timeout=${timeoutMs})` : ''}
229
+ ${action === 'uncheck' ? `page.uncheck("${selector}", timeout=${timeoutMs})` : ''}
230
+ ${action === 'press' ? `page.press("${selector}", "${escapedValue}", timeout=${timeoutMs})` : ''}
231
+ ${action === 'waitFor' ? `page.wait_for_selector("${selector}", timeout=${timeoutMs})` : ''}
232
+ ${action === 'scroll' ? `page.locator("${selector}").scroll_into_view_if_needed(timeout=${timeoutMs})` : ''}
233
+ result["action"] = "${action}"
234
+ result["selector"] = "${selector}"
235
+ result["url"] = page.url
236
+ result["title"] = page.title()
237
+ `;
238
+ const out = await sandbox.process.codeRun(playwrightScript(body), undefined, Math.ceil(timeoutMs / 1000) + 15);
239
+ const parsed = extractResult(out.result ?? '');
240
+ emitProgress({ type: 'tool:end', label: `Browser ${action} complete` });
241
+ return parsed;
242
+ },
243
+ }),
244
+ browserRunScript: tool({
245
+ description: 'Run a full multi-step Playwright Python script inside the sandboxed browser in one call — navigate, fill a login form, click submit, wait for a result, extract data — all in a single page session. Use this instead of chaining browserNavigate + browserAction when steps depend on each other within the same page load (e.g. login flows, multi-field forms, infinite scroll). The script body runs with `page`, `context`, and `result` (dict) already available; populate result with whatever you want returned.',
246
+ inputSchema: z.object({
247
+ startUrl: z.string().url().describe('URL to navigate to first.'),
248
+ scriptBody: z
249
+ .string()
250
+ .describe('Python lines using Playwright sync API: page.fill(...), page.click(...), page.wait_for_selector(...), etc. Populate result["key"] = value for anything you want returned. Do NOT include page.goto for startUrl — that is handled automatically.'),
251
+ timeoutMs: z.number().int().min(5000).max(120_000).optional().default(45_000),
252
+ headless: z.boolean().optional().default(true).describe('Set false only if visually debugging via screenshot is needed mid-script.'),
253
+ }),
254
+ execute: async ({ startUrl, scriptBody, timeoutMs, headless }) => {
255
+ const approved = await confirmBrowserAction('Run multi-step browser script', [
256
+ `Start URL: ${startUrl}`,
257
+ `Script: ${scriptBody.slice(0, 200)}${scriptBody.length > 200 ? '…' : ''}`,
258
+ ]);
259
+ if (!approved)
260
+ throw new Error('Blocked browser script. Ask user to approve.');
261
+ const sandbox = getActiveSandbox();
262
+ emitProgress({ type: 'tool:start', label: 'Running browser script', detail: startUrl });
263
+ const body = `
264
+ page.goto("${startUrl}", timeout=${timeoutMs})
265
+ ${scriptBody.split('\n').map((l) => ' ' + l).join('\n')}
266
+ result.setdefault("url", page.url)
267
+ result.setdefault("title", page.title())
268
+ `;
269
+ const out = await sandbox.process.codeRun(playwrightScript(body, { headless }), undefined, Math.ceil(timeoutMs / 1000) + 30);
270
+ const parsed = extractResult(out.result ?? '');
271
+ emitProgress({ type: 'tool:end', label: 'Browser script complete' });
272
+ return parsed;
273
+ },
274
+ }),
275
+ browserExtract: tool({
276
+ description: 'Extract structured data from the current page using CSS selectors — text content, attribute values, or all matches for a repeated element (e.g. all product titles + prices in a list). Use after browserNavigate.',
277
+ inputSchema: z.object({
278
+ url: z.string().url().describe('Page to load before extracting.'),
279
+ fields: z
280
+ .array(z.object({
281
+ name: z.string().describe('Output field name.'),
282
+ selector: z.string().describe('CSS selector for this field.'),
283
+ attribute: z.string().optional().describe('HTML attribute to read instead of text content, e.g. "href" or "src".'),
284
+ multiple: z.boolean().optional().default(false).describe('If true, returns an array of all matches instead of just the first.'),
285
+ }))
286
+ .min(1),
287
+ timeoutMs: z.number().int().min(1000).max(60_000).optional().default(30_000),
288
+ }),
289
+ execute: async ({ url, fields, timeoutMs }) => {
290
+ const approved = await confirmBrowserAction('Extract page data', [`URL: ${url}`, `Fields: ${fields.map((f) => f.name).join(', ')}`]);
291
+ if (!approved)
292
+ throw new Error('Blocked extraction. Ask user to approve.');
293
+ const sandbox = getActiveSandbox();
294
+ emitProgress({ type: 'tool:start', label: 'Extracting data', detail: url });
295
+ const extractLines = fields.map((f) => {
296
+ const accessor = f.attribute ? `.get_attribute("${f.attribute}")` : '.inner_text()';
297
+ if (f.multiple) {
298
+ return `result["${f.name}"] = [el${accessor} for el in page.query_selector_all("${f.selector}")]`;
299
+ }
300
+ return `el_${f.name} = page.query_selector("${f.selector}"); result["${f.name}"] = el_${f.name}${accessor} if el_${f.name} else None`;
301
+ }).join('\n ');
302
+ const body = `
303
+ page.goto("${url}", timeout=${timeoutMs})
304
+ ${extractLines}
305
+ `;
306
+ const out = await sandbox.process.codeRun(playwrightScript(body), undefined, Math.ceil(timeoutMs / 1000) + 15);
307
+ const parsed = extractResult(out.result ?? '');
308
+ emitProgress({ type: 'tool:end', label: 'Extraction complete', detail: `${fields.length} fields` });
309
+ return parsed;
310
+ },
311
+ }),
312
+ browserScreenshot: tool({
313
+ description: 'Take a screenshot of the current sandboxed browser page (or a specific URL) and save it locally for the agent to view via analyzeScreenshot. Useful for visually verifying page state, debugging selectors, or showing the user what a page looks like.',
314
+ inputSchema: z.object({
315
+ url: z.string().url().optional().describe('If provided, navigates here first. Otherwise screenshots the current page.'),
316
+ fullPage: z.boolean().optional().default(false).describe('Capture the full scrollable page instead of just the viewport.'),
317
+ }),
318
+ execute: async ({ url, fullPage }) => {
319
+ const approved = await confirmBrowserAction('Browser screenshot', [url ? `URL: ${url}` : 'Current page', fullPage ? 'Full page' : 'Viewport only']);
320
+ if (!approved)
321
+ throw new Error('Blocked screenshot. Ask user to approve.');
322
+ const sandbox = getActiveSandbox();
323
+ emitProgress({ type: 'tool:start', label: 'Taking browser screenshot' });
324
+ const remotePath = `/tmp/zilmate-shot-${ts()}.png`;
325
+ const body = `
326
+ ${url ? `page.goto("${url}", timeout=30000)` : ''}
327
+ page.screenshot(path="${remotePath}", full_page=${fullPage ? 'True' : 'False'})
328
+ result["remotePath"] = "${remotePath}"
329
+ result["url"] = page.url
330
+ `;
331
+ const out = await sandbox.process.codeRun(playwrightScript(body), undefined, 45);
332
+ const parsed = extractResult(out.result ?? '');
333
+ // Pull the screenshot bytes down from the sandbox filesystem to local disk
334
+ const dir = await ensureOutputDir();
335
+ const localPath = path.join(dir, `screenshot-${ts()}.png`);
336
+ const bytes = await sandbox.fs.downloadFile(remotePath);
337
+ await writeFile(localPath, bytes);
338
+ emitProgress({ type: 'tool:end', label: 'Screenshot saved', detail: localPath });
339
+ return { ...parsed, localPath };
340
+ },
341
+ }),
342
+ };
343
+ // ─── Barrel export ────────────────────────────────────────────────────────────
344
+ export const daytonaBrowserTools = {
345
+ ...sandboxLifecycleTools,
346
+ ...browsingTools,
347
+ };
348
+ //# sourceMappingURL=daytona-browser.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daytona-browser.tool.js","sourceRoot":"","sources":["../../src/tools/daytona-browser.tool.ts"],"names":[],"mappings":"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"}
@@ -112,16 +112,16 @@ async function captureScreenshot() {
112
112
  await mkdir(screenshotDir, { recursive: true });
113
113
  const target = path.join(screenshotDir, `zilmate-screen-${Date.now()}.png`);
114
114
  if (process.platform === 'win32') {
115
- const script = `
116
- Add-Type -AssemblyName System.Windows.Forms
117
- Add-Type -AssemblyName System.Drawing
118
- $bounds = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds
119
- $bitmap = New-Object System.Drawing.Bitmap $bounds.Width, $bounds.Height
120
- $graphics = [System.Drawing.Graphics]::FromImage($bitmap)
121
- $graphics.CopyFromScreen($bounds.Location, [System.Drawing.Point]::Empty, $bounds.Size)
122
- $bitmap.Save('${safeShellText(target)}', [System.Drawing.Imaging.ImageFormat]::Png)
123
- $graphics.Dispose()
124
- $bitmap.Dispose()
115
+ const script = `
116
+ Add-Type -AssemblyName System.Windows.Forms
117
+ Add-Type -AssemblyName System.Drawing
118
+ $bounds = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds
119
+ $bitmap = New-Object System.Drawing.Bitmap $bounds.Width, $bounds.Height
120
+ $graphics = [System.Drawing.Graphics]::FromImage($bitmap)
121
+ $graphics.CopyFromScreen($bounds.Location, [System.Drawing.Point]::Empty, $bounds.Size)
122
+ $bitmap.Save('${safeShellText(target)}', [System.Drawing.Imaging.ImageFormat]::Png)
123
+ $graphics.Dispose()
124
+ $bitmap.Dispose()
125
125
  `;
126
126
  await execFileAsync('powershell.exe', ['-NoProfile', '-Command', script], { windowsHide: true, timeout: 20_000 });
127
127
  return target;
@@ -8,11 +8,11 @@ import { generateSlideDeck } from '../documents/slides.js';
8
8
  async function expandContent(kind, title, content, audience) {
9
9
  const result = await generateText({
10
10
  model: models.manager,
11
- prompt: `Create ${kind === 'slides' ? 'a slide deck' : 'a document'} titled "${title}".
12
- Audience: ${audience || 'general'}
13
- Source notes:
14
- ${content}
15
-
11
+ prompt: `Create ${kind === 'slides' ? 'a slide deck' : 'a document'} titled "${title}".
12
+ Audience: ${audience || 'general'}
13
+ Source notes:
14
+ ${content}
15
+
16
16
  ${kind === 'slides'
17
17
  ? 'Return markdown with slides separated by --- lines. Each slide: # title then bullet points. 6-12 slides.'
18
18
  : 'Return polished markdown with # title, ## sections, paragraphs, and bullet lists.'}`,
@@ -0,0 +1,18 @@
1
+ export declare const financeTools: {
2
+ getTickerQuote: import("ai").Tool<{
3
+ symbol: string;
4
+ }, any>;
5
+ getHistoricalData: import("ai").Tool<{
6
+ symbol: string;
7
+ period1: string;
8
+ interval: "1d" | "1wk" | "1mo";
9
+ period2?: string | undefined;
10
+ }, any>;
11
+ searchCompany: import("ai").Tool<{
12
+ query: string;
13
+ }, any>;
14
+ getTickerSummary: import("ai").Tool<{
15
+ symbol: string;
16
+ }, any>;
17
+ };
18
+ //# sourceMappingURL=finance.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finance.tool.d.ts","sourceRoot":"","sources":["../../src/tools/finance.tool.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;CAiFxB,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { tool } from 'ai';
2
+ import { z } from 'zod';
3
+ import yahooFinance from 'yahoo-finance2';
4
+ import { emitProgress } from '../runtime/progress.js';
5
+ export const financeTools = {
6
+ getTickerQuote: tool({
7
+ description: 'Get live stock/crypto ticker quotes, price, change, and market cap using Yahoo Finance.',
8
+ inputSchema: z.object({
9
+ symbol: z.string().describe('Ticker symbol, e.g. AAPL, BTC-USD, TSLA.'),
10
+ }),
11
+ execute: async ({ symbol }) => {
12
+ emitProgress({ type: 'tool:start', label: 'Fetching ticker quote', detail: symbol });
13
+ try {
14
+ const quote = await yahooFinance.quote(symbol);
15
+ emitProgress({ type: 'tool:end', label: 'Ticker quote retrieved' });
16
+ return quote;
17
+ }
18
+ catch (error) {
19
+ emitProgress({ type: 'tool:error', label: 'Ticker quote failed', detail: String(error) });
20
+ throw error;
21
+ }
22
+ },
23
+ }),
24
+ getHistoricalData: tool({
25
+ description: 'Get historical price data for a ticker over a period (daily, weekly, monthly).',
26
+ inputSchema: z.object({
27
+ symbol: z.string().describe('Ticker symbol.'),
28
+ period1: z.string().describe('Start date (YYYY-MM-DD).'),
29
+ period2: z.string().optional().describe('End date (YYYY-MM-DD), default is today.'),
30
+ interval: z.enum(['1d', '1wk', '1mo']).optional().default('1d'),
31
+ }),
32
+ execute: async ({ symbol, period1, period2, interval }) => {
33
+ emitProgress({ type: 'tool:start', label: 'Fetching historical data', detail: symbol });
34
+ try {
35
+ const history = await yahooFinance.historical(symbol, {
36
+ period1,
37
+ period2: period2 || new Date().toISOString().split('T')[0],
38
+ interval: interval,
39
+ });
40
+ emitProgress({ type: 'tool:end', label: 'Historical data retrieved' });
41
+ return history;
42
+ }
43
+ catch (error) {
44
+ emitProgress({ type: 'tool:error', label: 'Historical data failed', detail: String(error) });
45
+ throw error;
46
+ }
47
+ },
48
+ }),
49
+ searchCompany: tool({
50
+ description: 'Search for ticker symbols and company information on Yahoo Finance.',
51
+ inputSchema: z.object({
52
+ query: z.string().describe('Company name or search term.'),
53
+ }),
54
+ execute: async ({ query }) => {
55
+ emitProgress({ type: 'tool:start', label: 'Searching company', detail: query });
56
+ try {
57
+ const result = await yahooFinance.search(query);
58
+ emitProgress({ type: 'tool:end', label: 'Company search complete' });
59
+ return result;
60
+ }
61
+ catch (error) {
62
+ emitProgress({ type: 'tool:error', label: 'Company search failed', detail: String(error) });
63
+ throw error;
64
+ }
65
+ },
66
+ }),
67
+ getTickerSummary: tool({
68
+ description: 'Get a comprehensive summary of a ticker including fundamentals, asset profile, and price history.',
69
+ inputSchema: z.object({
70
+ symbol: z.string().describe('Ticker symbol.'),
71
+ }),
72
+ execute: async ({ symbol }) => {
73
+ emitProgress({ type: 'tool:start', label: 'Fetching ticker summary', detail: symbol });
74
+ try {
75
+ const summary = await yahooFinance.quoteSummary(symbol, {
76
+ modules: ['price', 'summaryDetail', 'assetProfile', 'financialData'],
77
+ });
78
+ emitProgress({ type: 'tool:end', label: 'Ticker summary retrieved' });
79
+ return summary;
80
+ }
81
+ catch (error) {
82
+ emitProgress({ type: 'tool:error', label: 'Ticker summary failed', detail: String(error) });
83
+ throw error;
84
+ }
85
+ },
86
+ }),
87
+ };
88
+ //# sourceMappingURL=finance.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finance.tool.js","sourceRoot":"","sources":["../../src/tools/finance.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const imageIntelligenceTools: {
2
+ removeBackground: import("ai").Tool<{
3
+ imagePath: string;
4
+ outputFileName?: string | undefined;
5
+ }, {
6
+ inputPath: string;
7
+ outputPath: string;
8
+ format: string;
9
+ status: string;
10
+ }>;
11
+ };
12
+ //# sourceMappingURL=image-intelligence.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-intelligence.tool.d.ts","sourceRoot":"","sources":["../../src/tools/image-intelligence.tool.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,sBAAsB;;;;;;;;;;CA4BlC,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { writeFile, mkdir } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { tool } from 'ai';
6
+ import { z } from 'zod';
7
+ import { emitProgress } from '../runtime/progress.js';
8
+ import { getOutputDir } from '../workspace/output-paths.js';
9
+ import { existsSync } from 'node:fs';
10
+ const execFileAsync = promisify(execFile);
11
+ const outputDir = getOutputDir('images');
12
+ async function runRembg(inputPath, outputPath) {
13
+ const pyScript = `
14
+ from rembg import remove
15
+ from PIL import Image
16
+ import os
17
+
18
+ input_path = '${inputPath.replace(/\\/g, '\\\\')}'
19
+ output_path = '${outputPath.replace(/\\/g, '\\\\')}'
20
+
21
+ with open(input_path, 'rb') as i:
22
+ input_data = i.read()
23
+ output_data = remove(input_data)
24
+ with open(output_path, 'wb') as o:
25
+ o.write(output_data)
26
+ `.trim();
27
+ const tempScriptPath = path.join(outputDir, `rembg-${Date.now()}.py`);
28
+ await writeFile(tempScriptPath, pyScript, 'utf8');
29
+ try {
30
+ const py = process.platform === 'win32' ? 'python' : 'python3';
31
+ await execFileAsync(py, [tempScriptPath], { timeout: 60000 });
32
+ }
33
+ finally {
34
+ // Note: In production we might want to keep logs or cleanup
35
+ }
36
+ }
37
+ export const imageIntelligenceTools = {
38
+ removeBackground: tool({
39
+ description: 'Remove the background from an image using professional-grade AI (rembg). Supports local files and returns a transparent PNG.',
40
+ inputSchema: z.object({
41
+ imagePath: z.string().describe('Absolute path to the input image file (JPG, PNG, etc.).'),
42
+ outputFileName: z.string().optional().describe('Optional custom name for the output file (without extension).'),
43
+ }),
44
+ execute: async ({ imagePath, outputFileName }) => {
45
+ if (!existsSync(imagePath))
46
+ throw new Error(`Input image not found: ${imagePath}`);
47
+ emitProgress({ type: 'tool:start', label: 'Removing background', detail: imagePath });
48
+ await mkdir(outputDir, { recursive: true });
49
+ const name = outputFileName || `nobg-${path.basename(imagePath, path.extname(imagePath))}`;
50
+ const outputPath = path.join(outputDir, `${name}-${Date.now()}.png`);
51
+ await runRembg(imagePath, outputPath);
52
+ emitProgress({ type: 'tool:end', label: 'Background removed', detail: outputPath });
53
+ return {
54
+ inputPath: imagePath,
55
+ outputPath,
56
+ format: 'transparent-png',
57
+ status: 'success'
58
+ };
59
+ },
60
+ }),
61
+ };
62
+ //# sourceMappingURL=image-intelligence.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-intelligence.tool.js","sourceRoot":"","sources":["../../src/tools/image-intelligence.tool.ts"],"names":[],"mappings":"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"}