@weavetab/mcp 2.5.0-beta.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 (281) hide show
  1. package/AGENTS.md +48 -0
  2. package/ARCHITECTURE.md +590 -0
  3. package/LICENSE +631 -0
  4. package/README.md +909 -0
  5. package/SECURITY.md +196 -0
  6. package/TROUBLESHOOTING.md +365 -0
  7. package/dist/anticaptcha/detector.d.ts +49 -0
  8. package/dist/anticaptcha/detector.js +465 -0
  9. package/dist/anticaptcha/integration.d.ts +36 -0
  10. package/dist/anticaptcha/integration.js +123 -0
  11. package/dist/anticaptcha/solver.d.ts +27 -0
  12. package/dist/anticaptcha/solver.js +552 -0
  13. package/dist/audit/logger.d.ts +13 -0
  14. package/dist/audit/logger.js +177 -0
  15. package/dist/audit/telemetry.d.ts +36 -0
  16. package/dist/audit/telemetry.js +162 -0
  17. package/dist/cdp/bridge.d.ts +16 -0
  18. package/dist/cdp/bridge.js +826 -0
  19. package/dist/cdp/confirm.d.ts +26 -0
  20. package/dist/cdp/confirm.js +79 -0
  21. package/dist/cdp/connector.d.ts +37 -0
  22. package/dist/cdp/connector.js +661 -0
  23. package/dist/cdp/extension.d.ts +36 -0
  24. package/dist/cdp/extension.js +118 -0
  25. package/dist/cdp/finder.d.ts +1 -0
  26. package/dist/cdp/finder.js +2 -0
  27. package/dist/cdp/helpers.d.ts +11 -0
  28. package/dist/cdp/helpers.js +195 -0
  29. package/dist/cdp/label_cache.d.ts +12 -0
  30. package/dist/cdp/label_cache.js +51 -0
  31. package/dist/cdp/lock.d.ts +33 -0
  32. package/dist/cdp/lock.js +206 -0
  33. package/dist/cdp/omni_broker.d.ts +17 -0
  34. package/dist/cdp/omni_broker.js +119 -0
  35. package/dist/cdp/profiles.d.ts +1 -0
  36. package/dist/cdp/profiles.js +87 -0
  37. package/dist/cdp/pruner.d.ts +41 -0
  38. package/dist/cdp/pruner.js +263 -0
  39. package/dist/cdp/ref_cache.d.ts +101 -0
  40. package/dist/cdp/ref_cache.js +234 -0
  41. package/dist/cdp/retry.d.ts +5 -0
  42. package/dist/cdp/retry.js +39 -0
  43. package/dist/cdp/retry_enhanced.d.ts +44 -0
  44. package/dist/cdp/retry_enhanced.js +102 -0
  45. package/dist/cdp/security.d.ts +50 -0
  46. package/dist/cdp/security.js +237 -0
  47. package/dist/cdp/verify.d.ts +39 -0
  48. package/dist/cdp/verify.js +143 -0
  49. package/dist/cdp/walker.d.ts +91 -0
  50. package/dist/cdp/walker.js +896 -0
  51. package/dist/cdp/walker.test.d.ts +2 -0
  52. package/dist/cdp/walker.test.js +172 -0
  53. package/dist/cdp/websocket_transport.d.ts +15 -0
  54. package/dist/cdp/websocket_transport.js +118 -0
  55. package/dist/cli/plugin.d.ts +9 -0
  56. package/dist/cli/plugin.js +1134 -0
  57. package/dist/cli/updater.d.ts +1 -0
  58. package/dist/cli/updater.js +72 -0
  59. package/dist/config/loader.d.ts +120 -0
  60. package/dist/config/loader.js +704 -0
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.js +1248 -0
  63. package/dist/intelligence/hints.d.ts +11 -0
  64. package/dist/intelligence/hints.js +39 -0
  65. package/dist/intelligence/intent.d.ts +33 -0
  66. package/dist/intelligence/intent.js +171 -0
  67. package/dist/intelligence/sessionMemory.d.ts +66 -0
  68. package/dist/intelligence/sessionMemory.js +284 -0
  69. package/dist/intelligence/sessionMemory.test.d.ts +2 -0
  70. package/dist/intelligence/sessionMemory.test.js +62 -0
  71. package/dist/intelligence/trail.d.ts +64 -0
  72. package/dist/intelligence/trail.js +233 -0
  73. package/dist/intelligence/trail.test.d.ts +2 -0
  74. package/dist/intelligence/trail.test.js +110 -0
  75. package/dist/intelligence/vision.d.ts +24 -0
  76. package/dist/intelligence/vision.js +151 -0
  77. package/dist/lifecycle/mission_manager.d.ts +16 -0
  78. package/dist/lifecycle/mission_manager.js +44 -0
  79. package/dist/overlay/bubble.d.ts +16 -0
  80. package/dist/overlay/bubble.js +37 -0
  81. package/dist/overlay/ghost.d.ts +35 -0
  82. package/dist/overlay/ghost.js +508 -0
  83. package/dist/overlay/injector.d.ts +22 -0
  84. package/dist/overlay/injector.js +198 -0
  85. package/dist/plugin/interface.d.ts +134 -0
  86. package/dist/plugin/interface.js +1 -0
  87. package/dist/plugin/loader.d.ts +18 -0
  88. package/dist/plugin/loader.js +155 -0
  89. package/dist/plugin/registry.d.ts +50 -0
  90. package/dist/plugin/registry.js +234 -0
  91. package/dist/security/blacklist.d.ts +24 -0
  92. package/dist/security/blacklist.js +80 -0
  93. package/dist/security/filter.d.ts +2 -0
  94. package/dist/security/filter.js +20 -0
  95. package/dist/security/guard.d.ts +8 -0
  96. package/dist/security/guard.js +35 -0
  97. package/dist/security/ratelimit.d.ts +11 -0
  98. package/dist/security/ratelimit.js +57 -0
  99. package/dist/security/secrets.d.ts +75 -0
  100. package/dist/security/secrets.js +365 -0
  101. package/dist/sensors/actionability.d.ts +81 -0
  102. package/dist/sensors/actionability.js +303 -0
  103. package/dist/sensors/guard.d.ts +25 -0
  104. package/dist/sensors/guard.js +168 -0
  105. package/dist/sensors/mutations.d.ts +23 -0
  106. package/dist/sensors/mutations.js +93 -0
  107. package/dist/sensors/network.d.ts +67 -0
  108. package/dist/sensors/network.js +193 -0
  109. package/dist/sensors/operation_monitor.d.ts +80 -0
  110. package/dist/sensors/operation_monitor.js +203 -0
  111. package/dist/sensors/pacing.d.ts +44 -0
  112. package/dist/sensors/pacing.js +111 -0
  113. package/dist/sensors/thoughts.d.ts +2 -0
  114. package/dist/sensors/thoughts.js +59 -0
  115. package/dist/sensors/wait.d.ts +12 -0
  116. package/dist/sensors/wait.js +44 -0
  117. package/dist/server.d.ts +7 -0
  118. package/dist/server.js +1687 -0
  119. package/dist/state/agent.d.ts +36 -0
  120. package/dist/state/agent.js +101 -0
  121. package/dist/state/cache.d.ts +16 -0
  122. package/dist/state/cache.js +92 -0
  123. package/dist/state/cache.test.d.ts +2 -0
  124. package/dist/state/cache.test.js +76 -0
  125. package/dist/state/delta.d.ts +71 -0
  126. package/dist/state/delta.js +234 -0
  127. package/dist/state/delta.test.d.ts +2 -0
  128. package/dist/state/delta.test.js +279 -0
  129. package/dist/state/groups.d.ts +15 -0
  130. package/dist/state/groups.js +80 -0
  131. package/dist/state/session.d.ts +30 -0
  132. package/dist/state/session.js +155 -0
  133. package/dist/tools/accessibility.d.ts +14 -0
  134. package/dist/tools/accessibility.js +32 -0
  135. package/dist/tools/ask.d.ts +14 -0
  136. package/dist/tools/ask.js +49 -0
  137. package/dist/tools/automation.d.ts +36 -0
  138. package/dist/tools/automation.js +218 -0
  139. package/dist/tools/browser_detect.d.ts +13 -0
  140. package/dist/tools/browser_detect.js +73 -0
  141. package/dist/tools/burst.d.ts +35 -0
  142. package/dist/tools/burst.js +344 -0
  143. package/dist/tools/canvas.d.ts +25 -0
  144. package/dist/tools/canvas.js +132 -0
  145. package/dist/tools/captcha.d.ts +38 -0
  146. package/dist/tools/captcha.js +209 -0
  147. package/dist/tools/click.d.ts +36 -0
  148. package/dist/tools/click.js +561 -0
  149. package/dist/tools/click_and_wait.d.ts +33 -0
  150. package/dist/tools/click_and_wait.js +149 -0
  151. package/dist/tools/clipboard.d.ts +29 -0
  152. package/dist/tools/clipboard.js +279 -0
  153. package/dist/tools/console.d.ts +21 -0
  154. package/dist/tools/console.js +107 -0
  155. package/dist/tools/cookies.d.ts +67 -0
  156. package/dist/tools/cookies.js +121 -0
  157. package/dist/tools/design_extract.d.ts +109 -0
  158. package/dist/tools/design_extract.js +641 -0
  159. package/dist/tools/dialog.d.ts +24 -0
  160. package/dist/tools/dialog.js +109 -0
  161. package/dist/tools/drag.d.ts +15 -0
  162. package/dist/tools/drag.js +29 -0
  163. package/dist/tools/emulation.d.ts +33 -0
  164. package/dist/tools/emulation.js +69 -0
  165. package/dist/tools/eval.d.ts +20 -0
  166. package/dist/tools/eval.js +92 -0
  167. package/dist/tools/fill.d.ts +41 -0
  168. package/dist/tools/fill.js +667 -0
  169. package/dist/tools/find.d.ts +30 -0
  170. package/dist/tools/find.js +60 -0
  171. package/dist/tools/geo.d.ts +19 -0
  172. package/dist/tools/geo.js +29 -0
  173. package/dist/tools/github/analyze.d.ts +4 -0
  174. package/dist/tools/github/analyze.js +113 -0
  175. package/dist/tools/github/cache.d.ts +21 -0
  176. package/dist/tools/github/cache.js +28 -0
  177. package/dist/tools/github/index.d.ts +4 -0
  178. package/dist/tools/github/index.js +4 -0
  179. package/dist/tools/github/issues.d.ts +9 -0
  180. package/dist/tools/github/issues.js +88 -0
  181. package/dist/tools/github/pr.d.ts +5 -0
  182. package/dist/tools/github/pr.js +88 -0
  183. package/dist/tools/github/rateLimiter.d.ts +4 -0
  184. package/dist/tools/github/rateLimiter.js +46 -0
  185. package/dist/tools/github/read.d.ts +34 -0
  186. package/dist/tools/github/read.js +74 -0
  187. package/dist/tools/github/repoContext.d.ts +20 -0
  188. package/dist/tools/github/repoContext.js +129 -0
  189. package/dist/tools/highlight.d.ts +20 -0
  190. package/dist/tools/highlight.js +140 -0
  191. package/dist/tools/hover.d.ts +19 -0
  192. package/dist/tools/hover.js +57 -0
  193. package/dist/tools/inspect.d.ts +17 -0
  194. package/dist/tools/inspect.js +125 -0
  195. package/dist/tools/integration.test.d.ts +2 -0
  196. package/dist/tools/integration.test.js +96 -0
  197. package/dist/tools/key.d.ts +25 -0
  198. package/dist/tools/key.js +173 -0
  199. package/dist/tools/macro_compiler.d.ts +7 -0
  200. package/dist/tools/macro_compiler.js +82 -0
  201. package/dist/tools/mouse.d.ts +21 -0
  202. package/dist/tools/mouse.js +62 -0
  203. package/dist/tools/navigate.d.ts +16 -0
  204. package/dist/tools/navigate.js +188 -0
  205. package/dist/tools/network_intercept.d.ts +17 -0
  206. package/dist/tools/network_intercept.js +151 -0
  207. package/dist/tools/office/index.d.ts +9 -0
  208. package/dist/tools/office/index.js +7 -0
  209. package/dist/tools/office/list.d.ts +15 -0
  210. package/dist/tools/office/list.js +41 -0
  211. package/dist/tools/office/parse.d.ts +20 -0
  212. package/dist/tools/office/parse.js +172 -0
  213. package/dist/tools/pdf.d.ts +22 -0
  214. package/dist/tools/pdf.js +42 -0
  215. package/dist/tools/performance.d.ts +12 -0
  216. package/dist/tools/performance.js +47 -0
  217. package/dist/tools/performance_test.d.ts +70 -0
  218. package/dist/tools/performance_test.js +128 -0
  219. package/dist/tools/plan.d.ts +39 -0
  220. package/dist/tools/plan.js +161 -0
  221. package/dist/tools/pointer.d.ts +35 -0
  222. package/dist/tools/pointer.js +522 -0
  223. package/dist/tools/read.d.ts +30 -0
  224. package/dist/tools/read.js +488 -0
  225. package/dist/tools/recording.d.ts +45 -0
  226. package/dist/tools/recording.js +124 -0
  227. package/dist/tools/response.d.ts +129 -0
  228. package/dist/tools/response.js +5 -0
  229. package/dist/tools/scrape.d.ts +24 -0
  230. package/dist/tools/scrape.js +140 -0
  231. package/dist/tools/screenshot.d.ts +40 -0
  232. package/dist/tools/screenshot.js +79 -0
  233. package/dist/tools/scroll.d.ts +23 -0
  234. package/dist/tools/scroll.js +196 -0
  235. package/dist/tools/select.d.ts +13 -0
  236. package/dist/tools/select.js +217 -0
  237. package/dist/tools/snapshot.d.ts +27 -0
  238. package/dist/tools/snapshot.js +99 -0
  239. package/dist/tools/storage.d.ts +18 -0
  240. package/dist/tools/storage.js +29 -0
  241. package/dist/tools/tabs.d.ts +77 -0
  242. package/dist/tools/tabs.js +342 -0
  243. package/dist/tools/thought.d.ts +16 -0
  244. package/dist/tools/thought.js +79 -0
  245. package/dist/tools/type.d.ts +65 -0
  246. package/dist/tools/type.js +1061 -0
  247. package/dist/tools/type_secret.d.ts +23 -0
  248. package/dist/tools/type_secret.js +229 -0
  249. package/dist/tools/upload.d.ts +19 -0
  250. package/dist/tools/upload.js +103 -0
  251. package/dist/tools/video_compiler.d.ts +24 -0
  252. package/dist/tools/video_compiler.js +199 -0
  253. package/dist/tools/viewport.d.ts +44 -0
  254. package/dist/tools/viewport.js +230 -0
  255. package/dist/tools/wait.d.ts +19 -0
  256. package/dist/tools/wait.js +202 -0
  257. package/dist/tools/wait_for.d.ts +23 -0
  258. package/dist/tools/wait_for.js +30 -0
  259. package/dist/tools/windows.d.ts +22 -0
  260. package/dist/tools/windows.js +57 -0
  261. package/dist/ui/index.d.ts +1 -0
  262. package/dist/ui/index.js +12 -0
  263. package/docs/DEV_MODE.md +68 -0
  264. package/docs/DOCUMENTATION.md +532 -0
  265. package/docs/PLUGINS.md +538 -0
  266. package/docs/TOOLS.md +104 -0
  267. package/docs/dev_plugin.md +310 -0
  268. package/ext-dist/background.js +467 -0
  269. package/ext-dist/content.js +3089 -0
  270. package/ext-dist/dashboard.html +583 -0
  271. package/ext-dist/hud/hud.js +73 -0
  272. package/ext-dist/hud/index.html +20 -0
  273. package/ext-dist/manifest.json +77 -0
  274. package/ext-dist/sidepanel/sidepanel.js +25 -0
  275. package/ext-dist/sidepanel.html +547 -0
  276. package/ext-dist/styles.css +218 -0
  277. package/icon.png +0 -0
  278. package/mcp.json +796 -0
  279. package/package.json +113 -0
  280. package/server.json +23 -0
  281. package/smithery.yaml +11 -0
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Weavetab — tools/burst.ts
3
+ * Executes multiple tool calls serially in one round-trip, with per-step delta checking.
4
+ * Weavetab by fy2ne
5
+ */
6
+ import { weaveClick } from "./click.js";
7
+ import { weaveType } from "./type.js";
8
+ import { weaveNavigate } from "./navigate.js";
9
+ import { weaveKey } from "./key.js";
10
+ import { browserScroll } from "./scroll.js";
11
+ import { browserWait } from "./wait.js";
12
+ import { browserMap } from "./read.js";
13
+ import { browserEval } from "./eval.js";
14
+ import { browserSelect } from "./select.js";
15
+ import { browserPointer } from "./pointer.js";
16
+ import { browserConsole } from "./console.js";
17
+ import { browserFind } from "./find.js";
18
+ import { browserFill } from "./fill.js";
19
+ import { weaveTypeSecret } from "./type_secret.js";
20
+ import { browserInspect } from "./inspect.js";
21
+ import { browserStorage } from "./storage.js";
22
+ import { browserCookies } from "./cookies.js";
23
+ import { browserHighlight } from "./highlight.js";
24
+ import { browserScrape } from "./scrape.js";
25
+ import { logAction } from "../audit/logger.js";
26
+ import { cacheActionMap } from "../state/cache.js";
27
+ import { buildActionMap } from "../cdp/walker.js";
28
+ import { sessionRegistry } from "../state/session.js";
29
+ import { getConfigAgentId, getConfigBrowserType } from "../config/loader.js";
30
+ import { sendToExtension } from "../cdp/helpers.js";
31
+ import { resetLoopCounter } from "../intelligence/trail.js";
32
+ /**
33
+ * Expand a macro step into primitive BurstSteps.
34
+ */
35
+ function expandMacro(step) {
36
+ if (step.tool === "type_and_send") {
37
+ const { x, y, text, id, label, pressEnter = true } = step.args;
38
+ if (!id && !label && x === undefined && y === undefined) {
39
+ throw new Error("type_and_send macro failed: no target specified (requires id, label, or x/y)");
40
+ }
41
+ if (text === undefined) {
42
+ throw new Error("type_and_send macro failed: text argument is required");
43
+ }
44
+ const typeArgs = { text, noRetry: true };
45
+ if (x !== undefined)
46
+ typeArgs.x = x;
47
+ if (y !== undefined)
48
+ typeArgs.y = y;
49
+ if (id)
50
+ typeArgs.id = id;
51
+ if (label)
52
+ typeArgs.label = label;
53
+ const steps = [{ tool: "browser_type", args: typeArgs }];
54
+ if (pressEnter)
55
+ steps.push({ tool: "browser_key", args: { key: "Enter" } });
56
+ return steps;
57
+ }
58
+ if (step.tool === "navigate_and_read") {
59
+ const { url } = step.args;
60
+ return [
61
+ { tool: "browser_go", args: { url } },
62
+ { tool: "browser_map", args: {} },
63
+ ];
64
+ }
65
+ if (step.tool === "click_and_wait") {
66
+ const { id, label, wait_for, wait_value, x, y } = step.args;
67
+ const clickArgs = {};
68
+ if (id)
69
+ clickArgs.id = id;
70
+ if (label)
71
+ clickArgs.label = label;
72
+ if (x !== undefined)
73
+ clickArgs.x = x;
74
+ if (y !== undefined)
75
+ clickArgs.y = y;
76
+ clickArgs.waitForNetwork = true;
77
+ clickArgs.waitAfter = 500;
78
+ return [
79
+ { tool: "browser_click", args: clickArgs },
80
+ ];
81
+ }
82
+ if (step.tool === "scroll_and_read") {
83
+ const { direction, distance } = step.args;
84
+ return [
85
+ { tool: "browser_scroll", args: { direction, distance } },
86
+ { tool: "browser_map", args: {} },
87
+ ];
88
+ }
89
+ if (step.tool === "fill_form") {
90
+ const { fields, submit } = step.args;
91
+ const steps = [];
92
+ if (fields && typeof fields === "object") {
93
+ for (const [id, value] of Object.entries(fields)) {
94
+ steps.push({ tool: "browser_fill", args: { id, value } });
95
+ }
96
+ }
97
+ if (submit) {
98
+ steps.push({ tool: "browser_key", args: { key: "Enter" } });
99
+ }
100
+ return steps;
101
+ }
102
+ if (step.tool === "drag_and_drop") {
103
+ const { id, end_id, x, y, end_x, end_y, label } = step.args;
104
+ const pointerArgs = { action: "drag_and_drop" };
105
+ if (id)
106
+ pointerArgs.ref = id;
107
+ if (end_id)
108
+ pointerArgs.end_ref = end_id;
109
+ if (label)
110
+ pointerArgs.label = label;
111
+ if (x !== undefined)
112
+ pointerArgs.x = x;
113
+ if (y !== undefined)
114
+ pointerArgs.y = y;
115
+ if (end_x !== undefined)
116
+ pointerArgs.end_x = end_x;
117
+ if (end_y !== undefined)
118
+ pointerArgs.end_y = end_y;
119
+ return [{ tool: "browser_pointer", args: pointerArgs }];
120
+ }
121
+ if (step.tool === "hover_and_read") {
122
+ const { id, label, x, y, holdMs = 300 } = step.args;
123
+ const pointerArgs = { action: "hover", holdMs };
124
+ if (id)
125
+ pointerArgs.ref = id;
126
+ if (label)
127
+ pointerArgs.label = label;
128
+ if (x !== undefined)
129
+ pointerArgs.x = x;
130
+ if (y !== undefined)
131
+ pointerArgs.y = y;
132
+ return [
133
+ { tool: "browser_pointer", args: pointerArgs },
134
+ { tool: "browser_map", args: {} },
135
+ ];
136
+ }
137
+ return [];
138
+ }
139
+ export async function browserBurst(session, args, config) {
140
+ if (!args.steps || args.steps.length === 0) {
141
+ return { success: true, steps_completed: 0, results: [], aborted: false };
142
+ }
143
+ // Expand macro steps into primitive steps first
144
+ const steps = [];
145
+ const MACRO_TOOLS = new Set(["type_and_send", "navigate_and_read", "click_and_wait", "scroll_and_read", "fill_form", "drag_and_drop", "hover_and_read"]);
146
+ for (const step of args.steps) {
147
+ if (MACRO_TOOLS.has(step.tool)) {
148
+ steps.push(...expandMacro(step));
149
+ }
150
+ else {
151
+ steps.push({
152
+ tool: step.tool,
153
+ args: JSON.parse(JSON.stringify(step.args || {}))
154
+ });
155
+ }
156
+ }
157
+ const { batch } = args;
158
+ // Inject fast: true if batch mode is on, unless explicitly set to false
159
+ if (batch) {
160
+ for (const step of steps) {
161
+ if (step.args.fast === undefined) {
162
+ step.args.fast = true;
163
+ }
164
+ }
165
+ }
166
+ const results = [];
167
+ let stepsCompleted = 0;
168
+ await sendToExtension(session, { type: 'Weavetab_STATE', hud: { action: `running ${steps.length} steps ${batch ? 'in batch' : 'in sequence'}...` } });
169
+ resetLoopCounter("burst");
170
+ for (let i = 0; i < steps.length; i++) {
171
+ const step = steps[i];
172
+ let result;
173
+ let stepError;
174
+ try {
175
+ switch (step.tool) {
176
+ case "browser_click":
177
+ result = await weaveClick(session, step.args, config);
178
+ break;
179
+ case "browser_type":
180
+ result = await weaveType(session, step.args, config);
181
+ break;
182
+ case "browser_go":
183
+ result = await weaveNavigate(session, step.args.url, config);
184
+ break;
185
+ case "browser_key":
186
+ result = await weaveKey(session, step.args, config);
187
+ break;
188
+ case "browser_scroll":
189
+ result = await browserScroll(session, step.args, config);
190
+ break;
191
+ case "browser_wait":
192
+ result = await browserWait(session, step.args, config);
193
+ break;
194
+ case "browser_map": {
195
+ const mapTargetId = sessionRegistry.getActive(getConfigAgentId(config))?.targetId || "default";
196
+ result = await browserMap(session, step.args, mapTargetId, config);
197
+ break;
198
+ }
199
+ case "browser_eval":
200
+ result = await browserEval(session, step.args, config);
201
+ break;
202
+ case "browser_select":
203
+ result = await browserSelect(session, step.args, config);
204
+ break;
205
+ case "browser_pointer":
206
+ result = await browserPointer(session, step.args, config);
207
+ break;
208
+ case "browser_console": {
209
+ let targetId = "default";
210
+ const active = sessionRegistry.getActive(getConfigAgentId(config));
211
+ if (active)
212
+ targetId = active.targetId;
213
+ result = await browserConsole(session, step.args, config, targetId);
214
+ break;
215
+ }
216
+ case "browser_find":
217
+ result = await browserFind(session, step.args, config);
218
+ break;
219
+ case "browser_fill":
220
+ result = await browserFill(session, step.args, config);
221
+ break;
222
+ case "browser_navigate":
223
+ result = await weaveNavigate(session, step.args.url, config);
224
+ break;
225
+ case "browser_type_secret":
226
+ result = await weaveTypeSecret(session, step.args, config);
227
+ break;
228
+ case "browser_screenshot": {
229
+ const { browserScreenshot } = await import("./screenshot.js");
230
+ result = await browserScreenshot(session, step.args, config);
231
+ break;
232
+ }
233
+ case "browser_inspect":
234
+ result = await browserInspect(session, step.args, config);
235
+ break;
236
+ case "browser_storage":
237
+ result = await browserStorage(session, step.args, config);
238
+ break;
239
+ case "browser_cookies":
240
+ result = await browserCookies(session, step.args, config);
241
+ break;
242
+ case "browser_highlight":
243
+ result = await browserHighlight(session, step.args, config);
244
+ break;
245
+ case "browser_scrape":
246
+ result = await browserScrape(session, step.args, config);
247
+ break;
248
+ case "browser_canvas": {
249
+ const { browserCanvas } = await import("./canvas.js");
250
+ result = await browserCanvas(session, step.args, config);
251
+ break;
252
+ }
253
+ case "browser_performance": {
254
+ const { browserPerformance } = await import("./performance.js");
255
+ result = await browserPerformance(session, config);
256
+ break;
257
+ }
258
+ case "browser_snapshot": {
259
+ const { browserSnapshot } = await import("./snapshot.js");
260
+ result = await browserSnapshot(session, step.args, config);
261
+ break;
262
+ }
263
+ case "browser_pdf": {
264
+ const { browserPdf } = await import("./pdf.js");
265
+ result = await browserPdf(session, step.args, config);
266
+ break;
267
+ }
268
+ case "browser_dialog": {
269
+ const { browserDialog } = await import("./dialog.js");
270
+ result = await browserDialog(session, step.args);
271
+ break;
272
+ }
273
+ case "browser_upload": {
274
+ const { browserUpload } = await import("./upload.js");
275
+ result = await browserUpload(session, step.args, config);
276
+ break;
277
+ }
278
+ case "browser_viewport": {
279
+ const { browserViewport } = await import("./viewport.js");
280
+ result = await browserViewport(session, step.args, config);
281
+ break;
282
+ }
283
+ case "browser_clipboard": {
284
+ const { browserClipboard } = await import("./clipboard.js");
285
+ result = await browserClipboard(session, step.args, config);
286
+ break;
287
+ }
288
+ case "browser_detect": {
289
+ const { detectBrowsers } = await import("./browser_detect.js");
290
+ result = detectBrowsers(getConfigBrowserType(config));
291
+ break;
292
+ }
293
+ case "browser_recording": {
294
+ const { browserRecording } = await import("./recording.js");
295
+ result = await browserRecording(session, step.args, config);
296
+ break;
297
+ }
298
+ case "browser_automation": {
299
+ const { browserAutomation } = await import("./automation.js");
300
+ result = await browserAutomation(session, step.args, config);
301
+ break;
302
+ }
303
+ default:
304
+ stepError = `Unknown tool "${step.tool}"`;
305
+ }
306
+ if (stepError) {
307
+ results.push({ step: i + 1, tool: step.tool, success: false, error: stepError });
308
+ stepsCompleted++;
309
+ logAction("browser_burst", `step_${i + 1}`, `error: ${stepError}`);
310
+ continue;
311
+ }
312
+ const resultObj = result && typeof result === "object" ? result : {};
313
+ const isError = resultObj.success === false;
314
+ results.push({
315
+ step: i + 1,
316
+ tool: step.tool,
317
+ success: !isError,
318
+ result: isError ? undefined : result,
319
+ error: isError ? resultObj.message || resultObj.stuck_hint || undefined : undefined,
320
+ });
321
+ stepsCompleted++;
322
+ }
323
+ catch (err) {
324
+ logAction("browser_burst", `step_${i + 1}`, `exception: ${err?.message ?? err}`);
325
+ results.push({ step: i + 1, tool: step.tool, success: false, error: `Exception: ${err?.message ?? String(err)}` });
326
+ stepsCompleted++;
327
+ }
328
+ logAction("browser_burst", `step_${i + 1}/${steps.length}`, step.tool);
329
+ }
330
+ // If batch was used, update cache once at the end
331
+ if (batch) {
332
+ const targetId = sessionRegistry.getActive(getConfigAgentId(config))?.targetId || "default";
333
+ const map = await buildActionMap(session, { lite: true }, targetId);
334
+ cacheActionMap(targetId, map);
335
+ }
336
+ await sendToExtension(session, { type: 'Weavetab_STATE', hud: { action: '' } });
337
+ const anySuccess = results.some(r => r.success);
338
+ return {
339
+ success: anySuccess,
340
+ steps_completed: stepsCompleted,
341
+ results,
342
+ aborted: false,
343
+ };
344
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Weavetab — tools/canvas.ts
3
+ * browser_canvas: Extract canvas image data as base64 or dispatch raw stroke/drawing events.
4
+ * Supports ref resolution via action map cache and CDP DOM APIs.
5
+ * Weavetab by fy2ne
6
+ */
7
+ import CDP from "chrome-remote-interface";
8
+ import type { Config } from "../config/loader.js";
9
+ export interface CanvasOptions {
10
+ action: "get_image" | "draw";
11
+ selector?: string;
12
+ id?: string;
13
+ label?: string;
14
+ ref?: string;
15
+ backendNodeId?: number;
16
+ points?: {
17
+ x: number;
18
+ y: number;
19
+ }[];
20
+ }
21
+ export declare function browserCanvas(session: CDP.Client, options: CanvasOptions, _config: Config): Promise<{
22
+ success: boolean;
23
+ dataUrl?: string;
24
+ message: string;
25
+ }>;
@@ -0,0 +1,132 @@
1
+ import { getConfigAgentId } from "../config/loader.js";
2
+ import { ghostClick } from "../overlay/ghost.js";
3
+ async function resolveCanvasBackendNodeId(session, options, _config) {
4
+ if (options.backendNodeId)
5
+ return options.backendNodeId;
6
+ const refId = options.ref || options.id;
7
+ if (!refId)
8
+ return undefined;
9
+ try {
10
+ const { getCachedActionMap } = await import("../state/cache.js");
11
+ const { sessionRegistry } = await import("../state/session.js");
12
+ const activeClient = sessionRegistry.getActive(getConfigAgentId(_config));
13
+ const targetId = activeClient?.targetId || "default";
14
+ const cachedMap = activeClient?.url ? getCachedActionMap(targetId, activeClient.url) : null;
15
+ if (cachedMap?.elements) {
16
+ const numericId = parseInt(refId.replace(/^w:/, ""), 10);
17
+ const el = cachedMap.elements.find((e) => {
18
+ const n = parseInt(String(e.id).replace(/^w:/, ""), 10);
19
+ return n === numericId;
20
+ });
21
+ if (el?.backendNodeId)
22
+ return el.backendNodeId;
23
+ }
24
+ }
25
+ catch { /* cache miss — fall through */ }
26
+ return undefined;
27
+ }
28
+ async function resolveCanvasViaCDP(session, backendNodeId) {
29
+ const { nodeIds } = await session.DOM.pushNodesByBackendIdsToFrontend({ backendNodeIds: [backendNodeId] });
30
+ if (!nodeIds?.[0])
31
+ throw new Error("Canvas backendNodeId could not be resolved");
32
+ const { object } = await session.DOM.resolveNode({ nodeId: nodeIds[0] });
33
+ if (!object?.objectId)
34
+ throw new Error("Could not resolve canvas node to object");
35
+ const { result } = await session.Runtime.callFunctionOn({
36
+ objectId: object.objectId,
37
+ functionDeclaration: `function() {
38
+ var rect = this.getBoundingClientRect();
39
+ return JSON.stringify({
40
+ x: rect.left,
41
+ y: rect.top,
42
+ dataUrl: this.toDataURL('image/png')
43
+ });
44
+ }()`,
45
+ returnByValue: true,
46
+ });
47
+ return JSON.parse(result.value);
48
+ }
49
+ async function resolveCanvasViaSelector(session, options, targetId) {
50
+ let selector;
51
+ if (options.selector) {
52
+ selector = options.selector;
53
+ }
54
+ else if (options.id) {
55
+ selector = `[data-wt-id="${options.id.replace(/^w:/, "")}"]`;
56
+ }
57
+ else if (options.label) {
58
+ selector = `canvas[aria-label="${options.label.replace(/"/g, '\\"')}"], canvas[title="${options.label.replace(/"/g, '\\"')}"]`;
59
+ }
60
+ else if (options.ref) {
61
+ selector = `[data-wt-id="${options.ref.replace(/^w:/, "")}"]`;
62
+ }
63
+ else {
64
+ selector = "canvas";
65
+ }
66
+ const { omniEvaluate } = await import("../cdp/omni_broker.js");
67
+ const raw = await omniEvaluate(session, targetId, `(function() {
68
+ let el;
69
+ try { el = document.querySelector(${JSON.stringify(selector)}); } catch(e) { el = null; }
70
+ // Skip extension overlay canvases
71
+ if (el && (el.closest('[data-wt-overlay]') || el.closest('.weavetab-overlay') || el.id === '__wt_ghost_canvas')) {
72
+ var total = document.querySelectorAll('canvas').length;
73
+ return JSON.stringify({ error: 'Selector matched a WeaveTab overlay canvas (hidden). Found ' + total + ' <canvas> element(s) on page — try a more specific selector or use nodeId.', exists: false });
74
+ }
75
+ if (!el) {
76
+ var total = document.querySelectorAll('canvas').length;
77
+ if (total === 0) return JSON.stringify({ error: 'No <canvas> elements found on this page.', exists: false });
78
+ return JSON.stringify({ error: 'Selector did not match any element. Found ' + total + ' <canvas> element(s) on page — try a more specific selector or use nodeId.', exists: false });
79
+ }
80
+ if (el.tagName !== 'CANVAS') return JSON.stringify({ error: 'Element is not a <canvas> — found <' + el.tagName.toLowerCase() + '> instead.', exists: false });
81
+ var r = el.getBoundingClientRect();
82
+ return JSON.stringify({ x: r.left, y: r.top, dataUrl: el.toDataURL('image/png'), exists: true });
83
+ })()`);
84
+ const parsed = JSON.parse(raw || "{}");
85
+ if (parsed.error)
86
+ throw new Error(parsed.error);
87
+ return parsed;
88
+ }
89
+ export async function browserCanvas(session, options, _config) {
90
+ const { action, points } = options;
91
+ const backendNodeId = await resolveCanvasBackendNodeId(session, options, _config);
92
+ const { sessionRegistry } = await import("../state/session.js");
93
+ const activeClient = sessionRegistry.getActive(getConfigAgentId(_config));
94
+ const targetId = activeClient?.targetId || "default";
95
+ let rect;
96
+ if (backendNodeId) {
97
+ try {
98
+ rect = await resolveCanvasViaCDP(session, backendNodeId);
99
+ }
100
+ catch {
101
+ rect = await resolveCanvasViaSelector(session, options, targetId);
102
+ }
103
+ }
104
+ else {
105
+ rect = await resolveCanvasViaSelector(session, options, targetId);
106
+ }
107
+ if (action === "get_image") {
108
+ return { success: true, dataUrl: rect.dataUrl, message: `Canvas extracted` };
109
+ }
110
+ else if (action === "draw") {
111
+ if (!points || points.length === 0) {
112
+ throw new Error("draw action requires an array of points");
113
+ }
114
+ const { Input } = session;
115
+ const { x: offsetX, y: offsetY } = rect;
116
+ const startX = offsetX + points[0].x;
117
+ const startY = offsetY + points[0].y;
118
+ await Input.dispatchMouseEvent({ type: "mouseMoved", x: startX, y: startY });
119
+ await ghostClick(session, startX, startY);
120
+ for (let i = 1; i < points.length; i++) {
121
+ const ptX = offsetX + points[i].x;
122
+ const ptY = offsetY + points[i].y;
123
+ await Input.dispatchMouseEvent({ type: "mouseMoved", x: ptX, y: ptY, button: "left" });
124
+ await new Promise(r => setTimeout(r, 10));
125
+ }
126
+ const lastX = offsetX + points[points.length - 1].x;
127
+ const lastY = offsetY + points[points.length - 1].y;
128
+ await Input.dispatchMouseEvent({ type: "mouseReleased", x: lastX, y: lastY, button: "left", clickCount: 1 });
129
+ return { success: true, message: `Drew ${points.length} points on canvas` };
130
+ }
131
+ throw new Error("Unknown action");
132
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Weavetab — tools/captcha.ts
3
+ * Dedicated browser_captcha tool for autonomous CAPTCHA detection and solving.
4
+ *
5
+ * Actions:
6
+ * detect → Identify CAPTCHA type, interaction method, and confidence
7
+ * solve → Attempt full autonomous solve (slider drag, hold, checkbox, invisible)
8
+ * wait_for_user → Show HUD prompt and poll until CAPTCHA is gone (120s timeout)
9
+ * status → Quick check: is a CAPTCHA currently blocking?
10
+ *
11
+ * Zero API keys. All solving via CDP mouse simulation.
12
+ * Weavetab by fy2ne
13
+ */
14
+ import CDP from "chrome-remote-interface";
15
+ import type { Config } from "../config/loader.js";
16
+ export interface CaptchaToolResult {
17
+ success: boolean;
18
+ action: string;
19
+ captcha_detected: boolean;
20
+ captcha_type?: string;
21
+ interaction_type?: string;
22
+ difficulty?: string;
23
+ confidence?: number;
24
+ /** True only when human input is truly required after all automated attempts */
25
+ human_needed: boolean;
26
+ solved?: boolean;
27
+ solve_method?: string;
28
+ message: string;
29
+ /** Specific instructions for the user when human_needed is true */
30
+ user_instructions?: string;
31
+ /** What the agent should do next */
32
+ next_action?: string;
33
+ execution_ms: number;
34
+ }
35
+ export declare function browserCaptcha(session: CDP.Client, args: {
36
+ action: "detect" | "solve" | "wait_for_user" | "status";
37
+ timeout?: number;
38
+ }, _config: Config): Promise<CaptchaToolResult>;